2017-02-16 71 views
1

我怎樣可以用不同的線在一個文件中搜索字符串替換文本在bash與/

當前替換文件中的以下文本在Linux中:

0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log 

更換行:#line_removed

我試過使用sed,但我的文件中的文件已經有一個/哪些是導致問題。我試圖將字符串存儲在一個變量中。但是,這是行不通的

#!/bin/bash 

var="0 22 * * * /scripts/application_folder_backup.sh >> /var/log/application_folder_backup.log" 

sed -i -e 's/$var/#line_removed/g' /tmp/k1.txt 

出口

+0

對'sed'命令使用雙引號。我無法找到原來的問題將其作爲重複關閉... – anishsane

+2

只有'/'不是問題,即使是'*'或所有特殊的正則表達式元字符都會成爲'sed' – anubhava

+0

或使用'perl -pe's | \ Q $ var | #line_removed |「的問題。/tmp/k1.txt' ... – Sundeep

回答

-1

我建議以前到$var內容喂到sed腳本,逃避所有的/字符是\/,如:

var_esc=$(echo "$var" | sed 's/\//\\\//g') 

sed表情變得很複雜(必須使用單引號,如果你不想加倍\字符,因爲雙引號也解釋反斜槓

另一件可以簡化表達式的方法是使用改變正則表達式分隔符的可能性(使用不同的char b egin吧)爲:

var_esc=$(echo "$var" | sed 's:/:\/:g') 

的想法是,取代$var變量之前,爲了躲避所有可能interferring字符,你可以有(你不知道一個修道院,如果有將要作爲您正在使用用於該目的的變量),然後替換他們在最後的命令:

sed "s/$var_esc/#line_removed/g" 

最後,如果你不想替代路線,只是刪除它,你可以做這樣的事情:

sed "/$var_esc/d" 

並且將刪除與您的$var_esc內容匹配的所有行。 (這個時候,我相信你無法改變的正則表達式的分隔符,爲/介紹匹配線運營商--- d是刪除輸出線中的命令)

另一種方式來刪除線在你的文件直接調用ex並通過編輯器命令作爲輸入:

ex file <<EOF   <-- edit "file" with the commands that follow until EOF is found. 
/$var_esc    <-- search for first occurrence of $var_esc 
d      <-- delete line 
w      <-- write file 
EOF     <-- eof marker. 
+0

對不起,解釋downvote的原因應該是禮貌的,因爲不僅問題已經得到解答,而且它似乎也是選定的答案。我也想知道爲什麼我的答案似乎不適合每個人。 –

1

只是/是不是這裏有問題,甚至*或所有特殊的正則表達式元字符將是sed一個問題,因爲它僅使用正則表達式搜索模式。

最好使用此non-regex基於awk命令:

awk -v var="$var" 'index($0, var) { $0 = "#line_removed" } 1' file 

#line_removed 

indexawk功能使用純文本搜索,而不是一個正則表達式基於搜索。

+1

不錯的一個,很可能OP要檢查整行,所以'$ 0 == var'也是一個選擇 – Sundeep

+0

是的,對於全行精確匹配'$ 0 == var'是正確的做法。 – anubhava

+1

謝謝大家的幫助。解決 – user230994

相關問題