答:的SunOS在bash腳本sed的 - 更換模式:沒有什麼變化
作爲 mlv和 sorontar提到,我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
預先感謝。
str0有一個新行嗎?在你的問題中嗎?你可以正確更新變量嗎? – Inian
str0有換行符,它只是在控制檯(echo str0 | ...)中進行測試..原來的數據是從輸入文件中獲取的。 – Triptaminer
爲什麼不能直接在文件中替換該模式?只需在腳本im中使用sed「s/\(val1 = \」| val2 = \「\)提供要替換爲 – Inian