如何使用sed删除所有尾随的Q';s、 但如果行全部为Q',则不删除最后一个Q;s

如何使用sed删除所有尾随的Q';s、 但如果行全部为Q',则不删除最后一个Q;s,sed,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中处理此案例,以供

我正在处理一个来自商业供应商的文件,该文件在每行末尾使用字母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

使用
awk
您可以尝试:

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

我假设您只有一行字,如果不是这样,请告诉我。

使用
sed

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

大致上,这会使用通过
\(
\)
保存的
\1
,将任何单个字符
替换为行末的零个或多个Q。它之所以有效,是因为sed是“贪婪的”。

@Cyrus,它留下了一行完全未触及的所有Q。我尝试了一个类似的方法,但也没能成功。干得好,似乎确实奏效了。与sed/grep相比,我对awk的了解要少得多,所以我从来没有想过要使用它。这有几个问题(
Q
已经是文本,所以不需要
[Q]
,gsub()的第一个参数是regexp而不是字符串,$0是默认打印的内容,等等),其中最重要的一点是它将从每行的中间删除Qs,不只是在最后。我只是换了线,你现在觉得怎么样?。谢谢你的反馈。