2017-01-11 44 views
0

答:的SunOS在bash脚本sed的 - 更换模式:没有什么变化

作为 mlvsorontar提到

,我SED的版本是BRE,不支持| (管)。所以在我的情况是有可能使用类似:

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

匹配名= “值=”但不其他= “值=”其中。正则表达式([namevlu])只包含我需要的字符。好吧,这不是像保存,因为可以,但我不希望存在像valuenm =“左右。如果有人需要确切指定正则表达式,它需要两个(或更多)sed。

原题:

我需要用另一个替换一个字符串,但可以肯定,我需要检查特定的上下文

例如:

等等VAL1 =“BASE.OLD_TEXT_OR_SO”布拉布拉
等等VAL2 = “BASE.OLD_SOMETHING” ...

我想改变

等等VAL1 = “BASE.NEW_TEXT_OR_SO” 布拉布拉
等等VAL2 = “BASE.NEW_SOMETHING” ...

这个脚本不会改变任何东西:

#!/bin/bash 

... 

str1="OLD_" 
str2="NEW_" 

sed "s/\(name=\"|value=\"\)BASE\.$str1/\1BASE\.$str2/g" input.file > output.file 

但后来similiar SED工程确定:

sed "s/\(<Tag>\)[A-Z0-9\-\._|]*\(<\/Tag>\)/\1$otherStr\2/g" input.file > output.file 

输出文件仍然BASE.OLD_:/

还当我尝试它在控制台上,我得到相同的(无)结果。我认为“寻找”模式有问题,但我不知道是什么。

$ 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)-release
桑达4.2.1

预先感谢。

+0

str0有一个新行吗?在你的问题中吗?你可以正确更新变量吗? – Inian

+0

str0有换行符,它只是在控制台(echo str0 | ...)中进行测试..原来的数据是从输入文件中获取的。 – Triptaminer

+0

为什么不能直接在文件中替换该模式?只需在脚本im中使用sed“s/\(val1 = \”| val2 = \“\)提供要替换为 – Inian

回答

0

mlvsorontar提到的,我的SED版本是BRE并没有按不支持| (管)。所以在我的情况是有可能使用类似:

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

匹配名= “值=”但不其他= “值=”其中。正则表达式([namevlu])只包含我需要的字符。好吧,这不是像保存,因为可以,但我不希望存在像valuenm =“左右。如果有人需要确切指定正则表达式,它需要两个(或更多)sed。

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/;}" 
+0

我认为是的,但是,现在我不能测试它。关于val [12]:在真正的脚本im使用name =“和Object =”的话。所以如果你是对的,sunOS不会有| (管),这将是我的下一个挑战:D – Triptaminer

+1

我害怕这一点。 – mlv