不使用sed或awk,只cut,当字段的数量未知或随每一行变化时,我如何得到最后一个字段?
当前回答
这是唯一可能的解决方案,只使用切割:
回声“s.t.r.i.n.g。”| cut -d'。- f2 - [repeat_following_part_forever_or_until_out_of_memory:] | cut -d'。- f2 -
使用此解决方案,字段的数量确实可以是未知的,并且随时变化。但是,由于行长不能超过LINE_MAX字符或字段(包括新行字符),那么任意数量的字段永远不能作为该解决方案的实际条件。
是的,一个非常愚蠢的解决方案,但我认为这是唯一符合标准的解决方案。
其他回答
你可以尝试这样做:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
解释
Rev将maps.google.com颠倒为moc.elgoog.spam Cut使用点(即“。”)作为分隔符,并选择第一个字段,即moc 最后,我们再次反向得到com
这是不可能只使用切割。下面是使用grep的方法:
grep -o '[^,]*$'
用逗号替换其他分隔符。
解释:
-o (--only-matching) only outputs the part of the input that matches the pattern (the default is to print the entire line if it contains a match). [^,] is a character class that matches any character other than a comma. * matches the preceding pattern zero or more time, so [^,]* matches zero or more non‑comma characters. $ matches the end of the string. Putting this together, the pattern matches zero or more non-comma characters at the end of the string. When there are multiple possible matches, grep prefers the one that starts earliest. So the entire last field will be matched.
完整的例子:
如果我们有一个叫data。csv的文件包含
one,two,three
foo,bar
然后输出grep -o '[^,]*$' < data.csv
three
bar
下面实现一个朋友的建议
#!/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
如果你的输入字符串不包含正斜杠,那么你可以使用basename和subshell:
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
它不使用sed或awk,但也不使用cut,所以我不太确定它是否有资格作为问题的答案。
如果处理可能包含正斜杠的输入字符串,这就不能很好地工作。对于这种情况,一种变通方法是将正斜杠替换为其他一些您知道不是有效输入字符串的一部分的字符。例如,管道(|)字符也不允许出现在文件名中,所以这是可行的:
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
没有awk ? 但是用awk很简单:
echo 'maps.google.com' | awk -F. '{print $NF}'
AWK是一个更强大的工具,可以放在你的口袋里。 -F if用于字段分隔符 NF是字段的数量(也表示最后一个字段的索引)
推荐文章
- 图形化对?
- 我如何能匹配一个字符串与正则表达式在Bash?
- 为什么cURL返回错误“(23)Failed writing body”?
- 在Unix shell中计算一列数字
- 在bash脚本中否定if条件
- 如何撤消“set -e”使bash立即退出,如果任何命令失败?
- 如何在docker映像的新容器中运行bash ?
- 管道命令输出到tee,但也保存退出代码的命令
- 如何自动添加用户帐户和密码与Bash脚本?
- 是否有方法按列“uniq”?
- 查找哪个进程被Linux OOM杀手杀死
- 如何在bash脚本中检查文件名的扩展名?
- 如何在Linux下将所有文件夹和文件重命名为小写?
- linux的图形化DIFF程序
- 使用bash的变量中第一个大写字符