2017-03-09 67 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