Without using sed
or awk
, only cut
, how do I get the last field when the number of fields are unknown or change with every line?
相关问题
- Is shmid returned by shmget() unique across proces
- how to get running process information in java?
- JQ: Select when attribute value exists in a bash a
- Error building gcc 4.8.3 from source: libstdc++.so
- Why should we check WIFEXITED after wait in order
If your input string doesn't contain forward slashes then you can use
basename
and a subshell:This doesn't use
sed
orawk
but it also doesn't usecut
either, so I'm not quite sure if it qualifies as an answer to the question as its worded.This doesn't work well if processing input strings that can contain forward slashes. A workaround for that situation would be to replace forward slash with some other character that you know isn't part of a valid input string. For example, the pipe (
|
) character is also not allowed in filenames, so this would work:You could try something like this:
Explanation
moc.elgoog.spam
cut
uses dot as the delimiter and chooses the first field, which ismoc
com
It is not possible using just
cut
. Here is a way usinggrep
:Replace the comma for other delimiters.
I realized if we just ensure a trailing delimiter exists, it works. So in my case I have comma and whitespace delimiters. I add a space at the end;
$ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b
If you have a file named filelist.txt that is a list paths such as the following: c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h
then you can do this: rev filelist.txt | cut -d"/" -f1 | rev
This is the only solution possible for using nothing but cut:
Using this solution, the number of fields can indeed be unknown and vary from time to time. However as line length must not exceed LINE_MAX characters or fields, including the new-line character, then an arbitrary number of fields can never be part as a real condition of this solution.
Yes, a very silly solution but the only one that meets the criterias I think.