2015-08-27 58 views
1

查找並替換文件中的文本。查找單詞相同的所有時間和替換字符串改變所有的時間用包含特殊字符的長字符串替換文本(每次更改)

我想要一個簡單的sed腳本(test.sh)來實現這個它使用一個參數(長字符串包含特殊字符):

sed -i "s/#####REPLACE#####/$1/g" file.txt 

結果應該用我傳遞給腳本test.sh的參數替換#####REPLACE#####

參數改變所有的時間,並含有大量的特殊字符(像這樣):

"abc"/def:-/ghi$jklmno-pqrblah..blah..very..long..string 

我嘗試的命令是:

./test.sh "abc"/def:-/ghi$jklmno-pqrblah..blah..very..long..string 

它給出了下面的消息:

sed: -e expression #1, char 25: unknown option to `s' 

我有很多文件(例如file1.txt,file2.txt,file3.txt)與相同的普通文本#####REPLACE#####被替換爲相同的參數"abc"/def:-/ghi$jklmno-pqrblah..blah..very..long..string

有什麼建議嗎?

+0

見http://stackoverflow.com/questions/29613304/is-it-possible-to -escape-regex-metacharacters-reliable-with-sed/29626460#29626460 –

回答

0

問題是,您正在使用/作爲sed中的正則表達式分隔符,同樣的字符也是替換字符串的一部分。在sed使用替代的正則表達式定界符:

sed -i "s~#####REPLACE#####~$1~g" file.txt 

這是假設~(波浪號)將不會在替換文本。如果是這樣的情況,那麼你甚至可以使用一個控制字符如如^ACTRLV(壓在一起),爲正則表達式分隔符。

sed -i "s^A#####REPLACE#####^A$1^Ag" file.txt 

PS:如果你想通過&爲文字&$1然後逃逸它作爲\&

+0

由於'$ 1'的各種值,這會失敗。 –

+0

不,如果按照我的建議將ctrl-A用作正則表達式分隔符,它不會失敗。只有'&'需要提供爲'\&' – anubhava

+0

對於control-A沒有任何魔法 - 除了'&',如果$ 1包含control-A或反斜槓後跟一個數字或文字換行符,它仍然會失敗或者以反斜槓結尾(還有更多?)。 –

2

一種選擇是向AWK改用:

awk -v replace="$1" '{ gsub(/#####REPLACE#####/, replace); print }' file 

這設置一個awk可變replace等於傳遞給函數$1的第一個參數,然後對的file每一行全局替換。

要覆蓋文件「in-place」,只需使用awk ... file > tmp && mv tmp file

這種方法優於使用sed的優點是,替換字符串*中出現的字符無關緊要。他們永遠不會導致語法錯誤。

*由於在評論中指出,有一個字符,這將打破東西:&


正如你在執行字符串替換(而不是正則表達式替換隻有真正感興趣),另一種選擇是使用這樣的:

awk -v replace="$1" '{ 
    out = "" 
    while(match($0, /#####REPLACE#####/)) { 
     out = out substr($0, 0, RSTART - 1) replace 
     $0 = substr($0, RSTART + RLENGTH) 
    } 
print out $0}' file 

這建立了使用複合替換字符串out輸入記錄的國家$0和變量replace

相關問題