用于替换数字的正则表达式不适用于“sed”

用于替换数字的正则表达式不适用于“sed”

使用 Linux bash。

我的文件中有以下代码,我想将数值 ( 1000) 更改为任何其他值。

文件:

//...
if (counter==(1000)) {
// ...

我尝试过使用这个命令:

sed 's/[0-9][0-9]+/9999/g' file.cpp

但没有任何改变。

此外,我希望这种改变是永久性的。我该怎么做呢?

答案1

您正在使用+来自的量词扩展正则表达式语法设置,但sed默认使用基本正则表达式。因此,您需要通过添加标志来打开 ERE -E

sed -E 's/[0-9][0-9]+/9999/' file.cpp

或使用相应的 BRE 构造

sed 's/[0-9]\{2,\}/9999/' file.cpp

它更便携(正如@Stéphane Chazelas 所指出的)。


请注意,这将修改任何包含两个或多个连续数字的行通过将该组替换为9999.如果您想确保只有符合您的示例的行

if (counter==(1000)) {

受到影响,我建议添加一个合适的地址说明符使匹配更加具体:

sed '/if (counter==([0-9]\{2,\}))/s/[0-9]\{2,\}/9999/' file.cpp 

这样,替换只会在匹配的行上执行。if (counter==(two-or-more-digit-number))

g选项似乎没有必要,因为在您的输入示例中,行上只有一个这样的数字组。


为了直接修改文件,大多数sed实现现在都理解-i“就地”修改的标志。再次,正如 @Stéphane Chazelas 正确指出的那样,如果您将它与其他标志结合使用,请确保顺序正确,正如-i期望的用于创建备份文件的后缀(在 GNU 上可能为空sed,但在FreeBSD/MacOS 实现):

  • sed -i '' -E 's/.../.../'将在 FreeBSD 上工作sed
  • sed -i -E 's/.../.../'或者sed -Ei 's/.../.../'将在 GNU 上工作sed
  • sed -iE 's/.../.../'将不起作用,因为将E被视为备份后缀。

相关内容