2011-06-01 61 views
2

我有一個包含一些特殊字符和他們的HTML實體名稱用於與具有意外替換的sed

CSV文件

例如:htm.csv

À,À 
Á,Á 
Â, 
Ã,Ã 
É,É 
Ê,Ê 
Í,Í 
Ó,Ó 
Ô,Ô 
Õ,Õ 

和我有一些.php文件,其中這些特殊字符當下。我寫了一個shell腳本

#!/bin/bash 
IFS="," 
while read orig html 
do 
    for fl in *.php; do 
    mv $fl $fl.old 
    sed 's/'$orig'/'$html'/g' $fl.old > $fl 
    done 
done< "htm.csv" 

但使用$html內容時的問題是,它是印刷的$orig代替"&"內容。

回答

4

&是一個特殊字符,意思是s///命令中的「整個匹配字符串」。使用\&

+0

但對於一堆文件的其不用於該文檔工作 – Priya 2011-06-01 12:51:39

+0

,見[這裏](HTTP ://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command) – 2011-06-01 13:13:48

+0

「要在最終替換中包含文字\,&或換行符,請確保在所需\之前, &,或換行換行符「。」 – l0b0 2011-06-01 13:23:53

0

除了特殊字符,你還可以命令一個更加安全和更短:

  • 沒有必要爲mv如果您sed支持-i(就地更換)
  • 爲了避免設置IFS爲命令的其餘部分可以在$html
限制其範圍
  • 逃生

    結果:

    #!/bin/bash 
    while IFS="," read orig html 
    do 
        for fl in *.php 
        do 
         sed -i 's/'$orig'/'${html//&/\\&}'/g' "$fl" 
        done 
    done < "htm.csv" 
    

    請添加一個例子,如果它不爲你工作。可能還有其他特殊字符必須逃脫。

  • +0

    其顯示錯誤 – Priya 2011-06-02 04:41:50

    1

    使用任何字符作爲命令分隔符,這裏是一個例子:使用\\&其工作

    sed -Ei "s|$k|$j|g" filename.txt