bash替换文件中的字符串,包含特殊字符

时间:2018-02-20 14:55:21

标签: bash sed

正如我在标题中所说的那样试图替换包含特殊字符的文件中的字符串,现在的想法就是在" infofile"的每一行上循环。包含许多行: whatiwantotreplace 替换者。 一旦我有这个我想做sed到某个文件来替换所有出现的string-> " whatiwantotreplace"与 - >"替换者"。 我的代码:

infofile="inforfilepath"
replacefile="replacefilepath"

while IFS= read -r line
do
   what2replace="a" #$(echo "$line" | cut -d"," -f1);
   replacer="b\\"  #$(echo "$line" | cut -d"," -f2 );
   sed  -i -e "s/$what2replace/$replacer/g" "$replacefile"
   #sed  -i -e "s/'$what2replace'/'$replacer'/g" "$replacefile"
   #sed  -i -e "s@$what2replace@$replacer@g" "$replacefile"
   #sed  -i -e s/$what2replace/$replacer/g' "$replacefile"
   #sed  -i -e "s/${what2replace}/${replacer}/g" "$replacefile"
   #${replacefile//what2replace/replacer}

done < "$infofile"

正如你所看到的,想要替换的字符串和我要替换的字符串可能包含特殊字符,所有注释行都是我尝试的东西(我在网上看到的东西),但仍然无能为力。

对于一些我有这个错误: &#34; sed:-e表达式#1,char 8:未终止的`s&#39;命令&#34; 对于一些什么都没有发生。

真的需要你的帮助

编辑:输入和输出: 提供输入和输出很难,因为我尝试的所有变体都有相同的东西,没有改变任何东西,唯一一个给出上述错误的是@的变化。 谢谢你的努力。

2 个答案:

答案 0 :(得分:1)

你可以试试这种方式

def method2(arr, low, high):
    out = np.empty(arr.shape, dtype=np.bool)
    for k in range(arr.shape[0]):
        a = arr[k]
        o = out[k]
        h = np.full_like(a, high)
        l = np.full_like(a, low)
        np.greater_equal(a, h, o)
        np.logical_or(o, a < l, o)
    return out

输出

what='a';to='b\\\\';echo 'sdev adfc xdae' | sed "s/${what}/${to}/g"

答案 1 :(得分:1)

你正在咆哮错误的树 - 你正在尝试使用一个没有处理文字字符串功能的工具sed进行文字字符串替换。请参阅Is it possible to escape regex metacharacters reliably with sed,了解尝试强制sed执行所需操作所需的复杂混乱,以及https://unix.stackexchange.com/q/169716/133219为什么要避免使用shell循环来操作文本。

只需使用awk,因为它具有文字字符串函数和隐式循环:

awk '
NR==FNR{map[$1]=$2; next}
{
    for (old in map) {
        new = map[old]
        head = ""
        tail = $0
        while ( s = index(tail,old) ) {
            head = head substr(tail,1,s-1) new
            tail = substr(tail,s+length(old))
        }
        $0 = head tail
    }
}
' "$infofile" "$replacefile"

上述情况当然未经测试,因为您未提供任何样本输入/输出。