2017-01-11 40 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