意外替换&与sed

时间:2011-06-01 11:14:11

标签: shell csv utf-8 sed

我有一个CSV文件,其中包含一些特殊字符及其HTML实体名称

ex: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而不是"&"的内容。

3 个答案:

答案 0 :(得分:5)

&是一个特殊字符,表示s///命令中的“整个匹配字符串”。使用\&

答案 1 :(得分:1)

使用任何字符作为命令分隔符,这是一个例子:

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

答案 2 :(得分: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"

如果它不适合您,请添加一个示例。可能还有其他特殊字符需要转义。