解答:
如mlv和sorontar所述,我的SED版本是BRE且不支持| (管)。所以在我的情况下可以使用类似的东西:
sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
匹配 name =" 和 value =" 但不是 其他=" 和 values =" 。正则表达式([namevlu])只包含我需要的字符。好吧,它不是可以保存,但我不希望存在像 valuenm =" 这样的东西。如果有人需要完全指定的正则表达式,它需要制作两个(或更多)seds。
原始问题:
我需要将一个字符串替换为另一个字符串,但我确实需要检查特定的上下文。
例如:
blah val1 =" BASE.OLD_TEXT_OR_SO"布拉布拉
blah val2 =" BASE.OLD_SOMETHING" ... 的
我想要改变
blah val1 =" BASE.NEW_TEXT_OR_SO"布拉布拉
blah val2 =" BASE.NEW_SOMETHING" ... 的
这个脚本没有改变任何东西:
#!/bin/bash
...
str1="OLD_"
str2="NEW_"
sed "s/\(name=\"|value=\"\)BASE\.$str1/\1BASE\.$str2/g" input.file > output.file
但后来类似的sed工作正常:
sed "s/\(<Tag>\)[A-Z0-9\-\._|]*\(<\/Tag>\)/\1$otherStr\2/g" input.file > output.file
输出文件仍然是 BASE.OLD _ :/
当我在控制台上尝试它时,我得到相同(无)的结果。我认为&#34;寻找&#34;模式,但我不知道是什么。
$ str0='blah name="BASE.OLD_TEXT_OR_SO" blabla
> blah value="BASE.OLD_SOMETHING" ...
> blah other="BASE.OLD_SOMETHING" ...
> blah values="BASE.OLD_SOMETHING" ...'
$ echo $str0 | sed "s/\(val1=\"|val2=\"\)BASE\.$str1/\1BASE\.$str2/g"
正则表达式在online tester进行了测试,并且工作正常。
(name="|value=")BASE\.OLD_
\1BASE\.NEW_
系统:
SunOS 5.11
GNU bash 4.1.11(1) - 发布
Sed 4.2.1
提前致谢。
答案 0 :(得分:2)
我不确定SunOS sed是否包含|。这将添加-r,我不认为SunOS sed支持。
但在这种情况下,您应该能够:
sed "s/\(val[12]=\"\)BASE.$str1/\1BASE.$str2/"
如果你不能使用val [12],那么我认为它不能在sed中完成。但它在perl中并不太难:
perl -pe "if (/val1=BASE.$str1/ || /val2=BASE.$str1/) {s/BASE.$str1/BASE.$str2/;}"
答案 1 :(得分:1)
在a basic sed only BRE are supported中,(POSIX BRE)和替换(|
)不存在。
你的正则表达式必须写成:
sed "s/\(val[12]=\"BASE\.\)${str1}/\1${str2}/g" input.file
如果您使用的sed版本支持(extended) ERE (which accepts the |
),那么您可以使用:
sed -E "s/(val(1|2)=\"BASE\.)${str1}/\1${str2}/g" input.file
答案 2 :(得分:0)