Unix 测试用于替换文本的SED命令时,不会出现错误,但它不是';我不能按计划工作
我试图在所有文件中搜索一个文本,并将其替换为单词EXAMPLE。我做了以下工作: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技巧,我们得到了
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<代码>谢谢,请考虑接受/支持我的回答。