Shell:替换模式时忽略转义序列

时间:2017-03-09 04:30:39

标签: bash shell unix sed

我搜索了这个主题并看到了一些例子但不知何故它对我不起作用。我必须在shell脚本(包含文件路径和扩展名)的文件中用另一行替换一行。我使用下面的命令,但替换不起作用。

<?php
    exec("mode COM3 BAUD=9600 PARITY=N data=8 stop=1 xon=off");

    $fp = fopen("com3", "r"); 
    if (!$fp) {
        echo "Not open";
    } else {
        $string = fgets($fp);
        echo $string;
        fclose($fp); 
    }
?>

sample.txt内容:

line='a|b|c|\\folder\file.txt'
upd_line='a|b|c|\\folder\file.txt|d'
sed -i 's#$line#$upd_line#g' sample.txt

我期待第二行被$ upd_line的内容替换,但它保持不变。请告诉我我做错了什么。我试着在bash和ksh中没有运气。

3 个答案:

答案 0 :(得分:2)

会是这样的:

line="a|b|c|\\\\\\\folder\\\file.txt"
sed -i "s#$line#&|d#g" sample.txt

输出:

HDR|date

a|b|c|\\folder\file.txt|d

答案 1 :(得分:2)

这可能适合你(GNU sed&amp; bash):

a='a|b|c|\\folder\file.txt'
b='a|b|c|\folder\file.txt|d'

qs(){ sed <<<$1 's/[][\\.*^$]/\\&/g';}

sed "s/$(qs $a)/$(qs $b)/" file

这会创建一个函数qs,它将变量字符串转换为sed regexp和替换中的接受形式。

N.B。在sed命令周围使用双引号;这允许shell插入shell变量和函数调用。如果在您选择的终端中使用GNU readline,C-M-e将在shell运行sed命令之前显示插值结果(您可能需要在运行它们之前重新引用结果)。

答案 2 :(得分:1)

perl更适合quote operators

$ cat sample.txt 
HDR|date    
a|b|c|\\folder\file.txt

$ # adding |d to end of line
$ line='a|b|c|\\folder\file.txt'
$ perl -pe "s/$/|d/ if /\Q$line/" sample.txt
HDR|date    
a|b|c|\\folder\file.txt|d

$ # generic search and replace
$ l='a|b|c|\\folder\file.txt' ul='a|b|c|\\folder\file.txt|d' perl -pe 's/\Q$ENV{l}/$ENV{ul}/' sample.txt
HDR|date    
a|b|c|\\folder\file.txt|d