如何使用sed删除所有结尾的Q,但是如果行是所有Q则不删除最后一个Q

时间:2018-07-25 19:16:50

标签: sed

我正在处理来自商业供应商的文件,该文件在每行末尾使用字母Q作为占位符。我需要删除每行末尾的所有Q,但绝对不要删除行中的所有内容。如果一行全是Q,则应保留单个Q。

我使用此sed代码删除了所有尾随的Q ...

line=$( echo $line | sed 's/Q*$//' )

...但是它不能处理所有行都是Q的情况,它应该保留1个Q。我当然可以使用此代码将Q添加回去。

if [ -z "$line" ]; then
    line="Q"
fi

...但是我想学习如何在sed中完全处理这种情况,以备将来参考。样本输出:

TESTQQQQQQ --> TEST
QQQ        --> Q

2 个答案:

答案 0 :(得分:2)

使用sed

  sed 's/\(.\)Q*$/\1/'

粗略地讲,这会使用.并通过\1和{{1}保存,将带有零个或多个Q的任何单个字符\(替换为该字符的行尾。 }。之所以有效,是因为\)是“贪婪的”。

答案 1 :(得分:1)

使用awk,您可以尝试:

awk '/^Q+$/{print "Q"; next} {gsub(/Q+$/,"")} 1' prueba.txt

如果不是这种情况,请告知我。