使用sed替换模式

时间:2016-09-22 05:26:30

标签: bash sed

我正在尝试替换所有模式 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。

1 个答案:

答案 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