2016-02-22 34 views
0

我使用FreeBSD,我有一個配置文件,我需要一個班輪,沒有管道,找到一個特定的字符串,如果發現替換,如果不追加到文件。Linux搜索並替換文件中的字符串,如果沒有找到

我看了看不同的選擇一樣,沒有好的工作:

  1. how-to-add-a-line-in-sed-if-not-match-is-found

  2. sed-command-how-to-replace-if-exists-else-just-insert

這是我的工作幾乎確定:

gsed -r 's/search/replace/; t; $areplace' 'app.conf' 

我遇到的問題是t命令未按預期工作。因爲如果我在文件內部有字符串「搜索」,它會替換,但它也會附加。如果「搜索」字符串是文件中的最後一個,它將替換,並且不會附加。

編輯 - 增加的採樣

樣品輸入:

ssh_enable="yes" 

snmpd_enable="YES" 

dumpdev="AUTO" 

樣本命令:

gsed -r 's/.*snmpd_enable=\".*\".*/snmpd_enable=\"NO\"/; t; $asnmpd_enable=\"NO\"/' 'app.conf' 

預期輸出:

ssh_enable="yes" 

snmpd_enable="NO" 

dumpdev="AUTO" 

實際輸出:

ssh_enable="yes" 
snmpd_enable="NO" 

dumpdev="AUTO" 

snmpd_enable="NO" 

編輯 - 解決方案

最後我用@ 123解決方案,

gawk -i inplace '{x+=sub(/search/,"replace")}END{if(!x)print "replace"}1' 

但這裏的問題是,如果該文件不包含搜索字符串,它會打印替換。任何ideeas?

+0

添加樣品的輸入和預期的輸出數據 – anubhava

+1

現在只是等待@ anubhava的awk的解決方案: - ) –

+0

但不能用sed來完成嗎?爲什麼t - 命令不能按預期工作? – hDan

回答

3

隨着gsed

sed 's/search/replace/;t1;/$^/{:1;H};${x;/./!{x;s/$/\nreplace/;b};x}' file 

使用awk

awk '{x+=sub(/search/,"replace")}END{if(!x)print "replace"}1' file 

與您的實際數據

sed '/^snmpd_enable=/{s/="[^"]*"/="NO"/;H};${x;/./!{x;s/$/\nsnmpd_enable="NO"/;b};x}' 

awk '/^snmpd_enable=/{x+=sub(/"[^"]*"/,"\"NO\"")}END{if(!x)print "snmpd_enable=\"NO\""}1' 
+1

您的解決方案可以正常工作,但如果找不到搜索模式,它將刪除最後一行並追加替換模式。 – hDan

+0

@mUncescu修正了,它沒有刪除它,我忘了把它換回來。 – 123

+0

我的解決方案爲awk,'sed'並不是我相信的最佳工具:) – anubhava