如何使用“sed或awk”从bash中的行中删除最后一个逗号

时间:2016-09-02 06:28:21

标签: bash awk sed

嗨,我想删除一行中的最后一个逗号。例如: 输入: 这是一个测试 期望的输出: 这是一个测试 我可以使用下面的命令删除最后一个逗号,如果它也是字符串的最后一个字符:(但这不是我想要的) echo“This,is,a,test,”| sed's /,$ //' 这是一个测试 如果在行中最后一个逗号后面有更多字符,则相同命令不起作用。 echo“This,is,a,test”| sed's /,$ //' 这是一个测试 我可以通过调用多个命令以脏方式实现结果,使用awk或sed正则表达式实现相同的任何替代方法?(这是我想要的) echo“This,is,a,test”| rev | sed's /,/ /'| rev 这是一个测试

5 个答案:

答案 0 :(得分:5)

您可以使用与非逗号匹配的正则表达式,并捕获该组,然后在替换中恢复它。

echo "This,is,a,test" |sed 's/,\([^,]*\)$/ \1/'

输出:

This,is,a test

答案 1 :(得分:4)

$ echo "This,is,a,test" | sed 's/\(.*\),/\1 /'
This,is,a test

有lookbehind,

$ echo "This,is,a,test" | perl -pe 's/.*\K,/ /'
This,is,a test

*贪婪,试图尽可能地匹配。

答案 2 :(得分:4)

所有答案都基于正则表达式。这是删除最后一个逗号的非正则表达方式:

s='This,is,a,test'
awk 'BEGIN{FS=OFS=","} {$(NF-1)=$(NF-1) " " $NF; NF--} 1' <<< "$s"

This,is,a test

答案 3 :(得分:1)

自Gnu AWK以来,标记为:

$ echo This,is,a,test|awk '$0=gensub(/^(.*),/,"\\1 ","g",$0)'
This,is,a test

答案 4 :(得分:1)

一种方法是使用Bash Parameter Expansion

$ s="This,is,a,test"
$ echo "${s%,*} ${s##*,}"
This,is,a test