如何在每个整数后跟一个字母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
我错过了什么?
答案 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'
看到脚本时)。
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'