2017-03-09 29 views
1

我已经搜索了这个主题,看到了一些例子,但不知何故它不适用于我。我必须在shell脚本(包含文件路径和扩展名)的文件中将另一行替换为另一行。我正在使用下面的命令,但替换不起作用。Shell:在替换模式时忽略转义序列

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 

sample.txt的内容:

HDR|date 

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

我期待第二行以$ upd_line内容所取代,但它保持不变。请告知我做错了什么。我尝试在bash和ksh没有运气。

回答

2

这可能会为你工作(GNU sed的&的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正则表达式和替换。

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

+0

这工作..非常感谢你 – Karthik

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 
+0

不幸的是行是从一个文件的内容,我可能无法改变 – Karthik

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