不使用sed或awk,只cut,当字段的数量未知或随每一行变化时,我如何得到最后一个字段?
当前回答
如果你的输入字符串不包含正斜杠,那么你可以使用basename和subshell:
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
它不使用sed或awk,但也不使用cut,所以我不太确定它是否有资格作为问题的答案。
如果处理可能包含正斜杠的输入字符串,这就不能很好地工作。对于这种情况,一种变通方法是将正斜杠替换为其他一些您知道不是有效输入字符串的一部分的字符。例如,管道(|)字符也不允许出现在文件名中,所以这是可行的:
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
其他回答
为这个老问题添加一个方法只是为了好玩:
$ cat input.file # file containing input that needs to be processed
a;b;c;d;e
1;2;3;4;5
no delimiter here
124;adsf;15454
foo;bar;is;null;info
$ cat tmp.sh # showing off the script to do the job
#!/bin/bash
delim=';'
while read -r line; do
while [[ "$line" =~ "$delim" ]]; do
line=$(cut -d"$delim" -f 2- <<<"$line")
done
echo "$line"
done < input.file
$ ./tmp.sh # output of above script/processed input file
e
5
no delimiter here
15454
info
除了bash,只使用cut。 我想,还有回声。
使用参数展开。这比包括cut(或grep)在内的任何外部命令都要有效得多。
data=foo,bar,baz,qux
last=${data##*,}
参见BashFAQ #100,了解bash中本地字符串操作的介绍。
如果你的输入字符串不包含正斜杠,那么你可以使用basename和subshell:
$ basename "$(echo 'maps.google.com' | tr '.' '/')"
它不使用sed或awk,但也不使用cut,所以我不太确定它是否有资格作为问题的答案。
如果处理可能包含正斜杠的输入字符串,这就不能很好地工作。对于这种情况,一种变通方法是将正斜杠替换为其他一些您知道不是有效输入字符串的一部分的字符。例如,管道(|)字符也不允许出现在文件名中,所以这是可行的:
$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'
如果你有一个名为fillist .txt的文件,它是一个列表路径,如下所示: c: / dir1 dir2 / file1.h c: / dir1 dir2 / dir3 / file2.h
然后你可以这样做: Rev fillist .txt | cut -d"/" -f1 | Rev
我意识到,如果我们只是确保后面的分隔符存在,它就可以工作。在我的例子中,我有逗号和空格分隔符。我在结尾加了一个空格;
$ ans="a, b"
$ ans+=" "; echo ${ans} | tr ',' ' ' | tr -s ' ' | cut -d' ' -f2
b
推荐文章
- 在Unix中,我可以在一个目录中运行'make'而不首先cd'到该目录吗?
- Github权限被拒绝:ssh添加代理没有身份
- 在bash中使用正则表达式进行搜索和替换
- 如何从命令行重置Jenkins安全设置?
- 如何查看Linux共享库正在导出的函数列表?
- 在Docker Alpine容器中启动一个shell
- 如何在Python中实现常见的bash习语?
- 如何通过docker运行传递参数到Shell脚本
- Bash“if [false];”返回true而不是false——为什么?
- 在shell脚本中使用$()而不是反引号的好处是什么?
- 快速unix命令显示文件中间的特定行?
- fork(), vfork(), exec()和clone()的区别
- 检查bash变量是否等于0
- 在tmux中保持窗口名称固定
- 只使用md5sum获取哈希值(没有文件名)