Bash换行符在每个整数后跟特定字符串

时间:2017-03-13 21:25:26

标签: bash sed

如何在每个整数后跟一个字母Q和一个整数?

中断一行

例如:

echo "Lorem ipsum Que Q94 dolor sit amet, Q3004 consectetur adipiscing
elit. Q1 Idcirco enim non desideraret" | sed -e $'s/Q\([0-9]\)/\\\nQ\1/g'

生成以下内容 - 错误 - 结果:

Lorem ipsum Que   
Q4 dolor sit amet,   
Q004 consectetur adipiscing elit. 
Q Idcirco enim non desideraret

注意每个Q之后缺少第一个整数位。

预期结果是:

Lorem ipsum Que   
Q94 dolor sit amet,   
Q3004 consectetur adipiscing elit. 
Q1 Idcirco enim non desideraret

我错过了什么?

3 个答案:

答案 0 :(得分:2)

如果你和我一样厌倦了所有这些sed变种(gnu,freebsd,open bsd,macos),那就有一个解决方案:使用perl -pe替换。
在所有机器中工作相同,语法几乎与gnu sed相同。 所以这是在Debian中测试的,并且在你的机器上也可以正常工作:

echo "...." |perl -pe 's/Q([0-9])/\nQ\1/g'

答案 1 :(得分:0)

您对$'...'ANSI C-quoted Bash string)的使用表明您正在使用 BSD / macOS sed,其中使用了转义序列{{1}替换字符串中不支持。

为了避免\n - 前面\解释的前缀转义序列与$'...'解释的前缀转义序列之间的混淆,我建议有选择地使用sed ,通过将其拼接到$'\n'脚本中的确切位置:

sed
    替换字符串中需要
  • ... | sed 's/Q[0-9]/\'$'\n''&/g' 来转义文字换行符,

  • 这是ANSI C引用的字符串\产生的(当$'\n'看到脚本时)。

    • 请注意, GNU sed 在替换字符串中支持sed,这会将命令简化为:\n < / LI>
  • 替换字符串占位符... | sed 's/Q[0-9]/\n&/g'表示正则表达式匹配的所有(每POSIX)。

    • 这使您无需像您尝试的那样定义捕获组,并且导致您的问题与&同时发生(见下文)。

至于您尝试的内容

使用$'...'“引入”$'...'字符引入的额外逃逸层。在\中,以便Q\([0-9]\)看到sed,其中 - 在没有非标准选项Q([0-9])的情况下激活扩展正则表达式(ERE) - 导致-E(被视为普通字符(它们位于basic regular expression (BRE)中,默认情况下)使用。

因此,没有定义捕获组,替换字符串中的sed扩展为空字符串

答案 2 :(得分:0)

GNU sed

sed 's/Q\([0-9]\)/\nQ\1/g'

sed 's/Q[0-9]/\n&/g'