![用于替换数字的正则表达式不适用于“sed”](https://linux22.com/image/189434/%E7%94%A8%E4%BA%8E%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%E2%80%9Csed%E2%80%9D.png)
使用 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
被视为备份后缀。