2014-09-04 127 views
0

我遇到一些問題,試圖使用SED使用具有正斜槓的變量編輯文件。SED使用變量查找字符串,編輯,然後替換

的文件,我試圖編輯「校驗」有如下內容...

758f9775093bf885dbc963cba1aec732,/bin/bash 
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 
03f670845fe199955f9a0babecbda9a0,/etc/networks 

我要搜索字符串「/斌/慶典」使用一個變量(FILE_PATH =「/斌/ bash「),當我找到該字符串時,將所有內容移除到」,「並替換爲」VALID「。

這是我的sed語法和下面的嘗試,但是當我嘗試使用變量時失敗。有什麼建議麼?

成功不變量

# sed '\/bin\/bash/ s/^.*,/VALID,/g' checksum 
VALID,/bin/bash 
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 
03f670845fe199955f9a0babecbda9a0,/etc/networks 

失敗可變

# file_path="/bin/bash" 
# echo $file_path 
/bin/bash 

# sed '/$file_path/ s/^.*,/VALID,/g' checksum 
758f9775093bf885dbc963cba1aec732,/bin/bash 
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 
03f670845fe199955f9a0babecbda9a0,/etc/networks 

我已經試過包裝在引號中的變量,{},仍然有同樣的故障:

# sed '/"$file_path"/ s/^.*,/VALID,/g' checksum 
758f9775093bf885dbc963cba1aec732,/bin/bash 
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 
03f670845fe199955f9a0babecbda9a0,/etc/networks 

# sed '/{$file_path}/ s/^.*,/VALID,/g' checksum 
758f9775093bf885dbc963cba1aec732,/bin/bash 
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 
03f670845fe199955f9a0babecbda9a0,/etc/networks 

我也用「|」作爲轉義字符。

# sed '|{$file_path}| s|^.*,|VALID,|g' checksum 
sed: -e expression #1, char 1: unknown command: `|' 

有關如何完成此任務的任何建議?

# sed --version 
GNU sed version 4.2.1 

回答

1

單引號抑制變量替換。試試這個:

sed "\:$file_path: s/^.*,/VALID,/" checksum 

請注意,我已將模式分隔符更改爲冒號,以便變量值的斜槓不會結束模式。

+0

完美!我會用這個。當我使用不同的分隔符進行測試時,我發現另一個區域是錯誤的。我並沒有逃避他們。謝謝你的幫助。 – 2014-09-04 18:07:25

1

要完成@奧加的好答案。保留單引號以避免bash可以解釋的特殊字符可能出現的歧義是很有趣的。要做到這一點,你可以簡單地關閉sed的塊用單引號後重新打開它:

sed '\~'$file_path'~s~^[^,]*~VALID~' checksum 
+0

oogas answer'$ file_path'在雙引號內,但與您的不同,它不在任何引號內。如何更好? – 2014-09-04 03:56:52

+0

這不是更好或更壞,這是用單引號來完成的方法。主要興趣是你可以在單引號之間寫任何你想要的東西,而不用bash解釋它。 – 2014-09-04 05:40:41

+0

@CasimiretHippolyte我不同意這裏。不以避免bash解釋不存在的插值元素爲代價來引用變量實際上更糟糕。 ':P' – 2014-09-04 06:28:38

1

只需使用AWK的簡單生活:

awk -v fp="$file_path" 'BEGIN{FS=OFS=","} $2==fp{$1="Valid"} 1' file 

,將工作,無論什麼內容的file_path,包括/或RE元字符或外殼匹配字符,如果內容部分匹配文件中的任何部分,則不會生成錯誤匹配。

+0

謝謝你這樣做,我總是讓我的生活更輕鬆。我應該開始使用更多的awk,但往往傾向於sed,因爲這是我所知道的更多。 – 2014-09-04 18:05:25