如果不使用 sed 或 awk ,只有 cut ,当字段数量未知或每行更改时,如何获取最后一个字段?
sed
awk
cut
你可以用bash shell编写一个小程序 .
你可以参考我的bash shell https://www.huuphan.com/2018/06/split-string-in-shell-and-get-last-field.html
我希望这对你有所帮助!
仅使用 cut 是不可能的 . 这是一种使用 grep 的方法:
grep
grep -o '[^,]*$'
替换其他分隔符的逗号 .
你可以尝试这样的事情:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Explanation
maps.google.com的反面将是 moc.elgoog.spam
moc.elgoog.spam
cut 使用点作为分隔符并选择第一个字段,即 moc
moc
最后,我们再次将其反转(感谢提醒,@ tom)获取 com
com
以下实现A friend's suggestion
#!/bin/bash rcut(){ nu="$( echo $1 | cut -d"$DELIM" -f 2- )" if [ "$nu" != "$1" ] then rcut "$nu" else echo "$nu" fi } $ export DELIM=. $ rcut a.b.c.d d
我意识到如果我们只确保存在一个尾随分隔符,它就可以工作 . 所以在我的情况下,我有逗号和空格分隔符 . 我在最后加了一个空格; $ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b
$ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b
如果您的输入字符串不包含正斜杠,那么您可以使用 basename 和子shell:
basename
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
这不使用 sed 或 awk ,但它也不使用 cut ,所以我不太确定它是否有资格作为问题的答案 .
这不是有效输入字符串的一部分 . 例如,管道( | )字符也不允许在文件名中,因此这将起作用:
|
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
使用参数扩展 . 这比任何类型的外部命令(包括 cut (或 grep ))更有效 .
data=foo,bar,baz,qux last=${data##*,}
有关bash中本机字符串操作的介绍,请参阅BashFAQ #100 .
这是唯一可以使用除切割之外的解决方案:
echo“s.t.r.i.n.g . ” |切-d' . ' -f2- [repeat_following_part_forever_or_until_out_of_memory:] |切-d' . ' -f2-
使用此解决方案,字段的数量确实可以是未知的,并且不时变化 . 但是,由于行长度不得超过LINE_MAX字符或字段(包括换行符),因此任意数量的字段永远不能成为此解决方案的真实条件 .
是的,这是一个非常愚蠢的解决方案,但是我认为唯一符合标准的解决方案 .
如果你有一个名为filelist.txt的文件,它是一个列表路径,如下所示:c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h
然后你可以这样做:rev filelist.txt | cut -d“/” - f1 |转
没有awk?...但是用awk这么简单:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK是一种更强大的工具,可放在口袋里 . -F if if field separator NF是字段数(也代表最后一个的索引)
有多种方式 . 你也可以用它 .
echo "Your string here"| tr ' ' '\n' | tail -n1 > here
显然,tr命令的空格输入应该用你需要的分隔符替换 .
11 回答
你可以用bash shell编写一个小程序 .
你可以参考我的bash shell https://www.huuphan.com/2018/06/split-string-in-shell-and-get-last-field.html
我希望这对你有所帮助!
仅使用
cut
是不可能的 . 这是一种使用grep
的方法:替换其他分隔符的逗号 .
你可以尝试这样的事情:
Explanation
maps.google.com的反面将是
moc.elgoog.spam
cut
使用点作为分隔符并选择第一个字段,即moc
最后,我们再次将其反转(感谢提醒,@ tom)获取
com
以下实现A friend's suggestion
我意识到如果我们只确保存在一个尾随分隔符,它就可以工作 . 所以在我的情况下,我有逗号和空格分隔符 . 我在最后加了一个空格;
$ ans="a, b" $ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2 b
如果您的输入字符串不包含正斜杠,那么您可以使用
basename
和子shell:这不使用
sed
或awk
,但它也不使用cut
,所以我不太确定它是否有资格作为问题的答案 .这不是有效输入字符串的一部分 . 例如,管道(
|
)字符也不允许在文件名中,因此这将起作用:使用参数扩展 . 这比任何类型的外部命令(包括
cut
(或grep
))更有效 .有关bash中本机字符串操作的介绍,请参阅BashFAQ #100 .
这是唯一可以使用除切割之外的解决方案:
使用此解决方案,字段的数量确实可以是未知的,并且不时变化 . 但是,由于行长度不得超过LINE_MAX字符或字段(包括换行符),因此任意数量的字段永远不能成为此解决方案的真实条件 .
是的,这是一个非常愚蠢的解决方案,但是我认为唯一符合标准的解决方案 .
如果你有一个名为filelist.txt的文件,它是一个列表路径,如下所示:c:/dir1/dir2/file1.h c:/dir1/dir2/dir3/file2.h
然后你可以这样做:rev filelist.txt | cut -d“/” - f1 |转
没有awk?...但是用awk这么简单:
AWK是一种更强大的工具,可放在口袋里 . -F if if field separator NF是字段数(也代表最后一个的索引)
有多种方式 . 你也可以用它 .
显然,tr命令的空格输入应该用你需要的分隔符替换 .