我正在尝试替换所有模式
myfile中s#_coded_block[#]
s#_coded_block_#
。我在网上看了如何用分组替换模式,我的命令是:
sed -i -E 's/s\([0-9]*\)_coded_block\[\([0-9]*\)\]/s\1_coded_block_\2/g' myfile
然而,我正在
在执行此命令时,无效的引用\ 2
命令的RHS。
答案 0 :(得分:1)
使用-E
选项,在捕获括号之前不需要反斜杠:
sed -i -E 's/s([0-9]*)_coded_block\[([0-9]*)\]/s\1_coded_block_\2/g' myfile
您可能需要一个或多个数字,在这种情况下,您使用的是+
而不是*
。如果您决定放弃-E
,原始代码应该有效,但如果您想要至少一个数字,则需要编写\{1,\}
:
sed -i 's/s\([0-9]\{1,\}\)_coded_block\[\([0-9]\{1,\}\)\]/s\1_coded_block_\2/g' myfile
显示的-i
表示法仅适用于GNU sed
。 BSD(macOS或Mac OS X)sed
会将第一个命令行中的-E
视为后缀(在第二个命令行中,您会收到有关m
未被提及的投诉一个有效的sed
命令,因为该脚本将被视为后缀,而m
的{{1}}将是一个错误的myfile
命令。您使用{{1备份(覆盖)没有后缀的文件。如果你想要可移植的代码,使用sed
创建一个包含两种变体的备份文件 - -i ''
必须附加到-i.bak
}对于GNU .bak
。