首页 > 解决方案 > 如何使用 sed 删除所有尾随 Q,但如果该行全是 Q,则不删除最后一个 Q

问题描述

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

标签: sed

解决方案


使用sed

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

粗略地说,这将使用 , 通过and保存.的单个字符替换具有零个或多个 Q 到行尾的任何单个字符。它之所以有效,是因为它“贪婪”。\1\(\)sed


推荐阅读