sunOS的bash脚本 - 替换模式:没有任何变化

时间:2017-01-11 15:04:08

标签: bash sed sunos

解答:

mlvsorontar所述,我的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

提前致谢。

3 个答案:

答案 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)

mlvsorontar所述,我的SED版本是BRE,不支持| (管)。所以在我的情况下可以使用类似的东西:

sed "s/\( [namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"

匹配 name =“ value =” 其他=“值=“的。正则表达式([namevlu])只包含我需要的字符。好吧,它不是保存,但我不希望存在类似 valuenm =“左右的东西。如果有人需要完全指定的正则表达式,它需要制作两个(或更多)seds。