Unix 测试用于替换文本的SED命令时,不会出现错误,但它不是';我不能按计划工作

Unix 测试用于替换文本的SED命令时,不会出现错误,但它不是';我不能按计划工作,unix,sed,sh,Unix,Sed,Sh,我试图在所有文件中搜索一个文本,并将其替换为单词EXAMPLE。我做了以下工作: for f in /home/testu/zz*; do sed -i "s/&VAR1\s*=\s*'?[1]{4}'?/EXAMPLE/g" "$f" done 它没有给出错误,文件似乎在文件系统中被“更新”,但它们不会被更改。如果我用grep命令测试regexp,它工作得很好,那么SED肯定有问题,它可能是SED版本吗 提前谢谢 多亏了Wiktor Stribiżew技巧,我们得到了

我试图在所有文件中搜索一个文本,并将其替换为单词EXAMPLE。我做了以下工作:

for f in /home/testu/zz*; do
        sed -i "s/&VAR1\s*=\s*'?[1]{4}'?/EXAMPLE/g" "$f"
done
它没有给出错误,文件似乎在文件系统中被“更新”,但它们不会被更改。如果我用grep命令测试regexp,它工作得很好,那么SED肯定有问题,它可能是SED版本吗


提前谢谢

多亏了Wiktor Stribiżew技巧,我们得到了解决方案(SED GNU 4.1.5)。生成的regexp与grep和sed一起工作。代码在最后是多种解决方案的混合

sed -i "s/&VAR1\s*=\s*'\{0,\}1\{4\}'\{0,\};\{0,\}/EXAMPLE/g" "$f"
有几件事:

[[:blank:]之类的内容导致输入文件出错

我的sed版本不支持-E,所以{}必须被转义,不知道:)


再次感谢威克托

当前的
sed
命令将正则表达式解析为符合POSIX BRE的模式

在BRE POSIX中,
匹配文本
字符,并且
{
/
}
也匹配文本
{
/
}
字符。要在BRE POSIX模式中生成范围量词,需要转义
{…}
\{min,max\}

[1]
等于
1
,因此括号在这里是多余的

要修复您的模式,您可以将
替换为
\{0,1\}
(0或1次出现)并将
{4}
替换为
\{4\}

sed -i "s/&VAR1\s*=\s*'\{0,1\}1\{4\}'\{0,1\}/EXAMPLE/g" "$f"

您是否知道
[1]{4}
匹配
1111
?这是你的意图吗?啊,使用
sed-i“s/&VAR1\s*=\s*\'1\{4\}\?/EXAMPLE/g“
sed-i”s/&VAR1[:blank:][:blank:][:blank:][blank:][]*'\'1\{4\}\\\\?/EXAMPLE/g”
好吧,它在GNU sed中。另一个变体:
sed-i“s/&VAR1[[:blank:][]*=[:blank:][]*'\{0,\}1\{4\}'\{0,\}/EXAMPLE/g“
,或
sed-i-E“s/&VAR1[:blank:][blank:][]*”?1{4}?/EXAMPLE/g“
你看到我的例子了吗?如果使用
sed-i'.'.
则必须使用
1\{4,\}
,如果使用
sed-i-E'.'.
,则可以使用
1{4}
。您不需要在1个字符左右使用
[…]
,请将它们删除。那么,从?您的
sed--版本是什么?我说:<代码> SED(GNU-SED)4.2.2<代码>谢谢,请考虑接受/支持我的回答。