Shell 意外取代&;与塞德

Shell 意外取代&;与塞德,shell,csv,utf-8,sed,Shell,Csv,Utf 8,Sed,我有一个CSV文件,其中包含一些特殊字符及其HTML实体名称 例如:htm.csv À,À Á,Á Â, Ã,à É,É Ê,Ê Í,Í Ó,Ó Ô,Ô Õ,Õ 我有许多.php文件,其中包含这些特殊字符。我已经写了一个shell脚本 #!/bin/bash IFS="," whi

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

例如:
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"
#/bin/bash
IFS=“,”
阅读原始html时
做
对于*.php中的fl;做
mv$fl$fl.old
sed's/'$orig'/'$html'/g'$fl.old>$fl
完成
完成<“htm.csv”

但问题是,当使用
$html
的内容时,它打印
$orig
的内容,而不是
“&”
&
是一个特殊字符,在
s//
命令中表示“整个匹配字符串”。使用
\&

除了特殊字符外,还可以使命令更安全、更短:

  • 如果您的
    sed
    支持
    -i
    (就地更换),则无需使用
    mv
  • 要避免为其余命令设置
    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"
#/bin/bash
当IFS=“,”读取原始html时
做
对于*.php中的fl
做
sed-i's/'$orig'/'${html/&/\\\&}'/g'$fl“
完成
完成<“htm.csv”

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

使用任何字符作为命令分隔符,下面是一个示例:

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

使用\\&its working但对于一组文件its not working有关该文件的文档,请参阅“要在最终替换中包含文字\、&、或换行符,请确保在所需的\、&、或换行符之前加上\”。注意,sed必须查看“
\&
”。你必须让反斜杠越过外壳,这会使事情变得非常复杂。