2012-11-09 22 views
4

我使用sed替換的conf的臺詞:如果我的期權行不以somefile存在如果沒有sed的模式回聲>>換行符

sed -i.bak 's/^option.*/option newparam/' somefile.conf

,我怎麼告訴sed將其插入或返回false?

最後,我結束了:

sed -i.bak "s/^#$STR.*\|^# $STR.*\|^$STR.*/$OPT/" $FILE && grep -q "^$OPT" $FILE || echo "$OPT" >> $FILE

+2

告訴它無條件地刪除選項(如果找到的話),並在最後添加更換?這假定序列無關緊要。 –

回答

2

使用grep來檢查線路首先存在,如果它不將其追加到使用雙管操作||文件的末尾。如果第一個命令返回true,那麼該操作將被短路,因此如果第一個命令失敗,則只執行第二個命令。

grep -q '^option.*' file.txt || echo 'option newparam' >> file.txt

-q選項禁止的grep的輸出和所述操作者||將只執行echo命令如果grep命令失敗,即如果$?0。一個簡單的例子:

$ cat file.txt 
line 1 
line 2 
line 3 

$ grep -q 'line 4' file.txt || echo 'line not in file' 
line not in file 

特殊變量$?包含來自前面的命令退出值。

$ grep -q 'line 4' file.txt 

$ echo $? 
1 

$ grep -q 'line 3' file.txt 

$ echo $? 
0 
+0

這真是太棒了,它應該和上面的sed命令一起工作。 – Chrisinpants

+0

如果你能夠upvote所有有用的答案,並接受最有用的,這將是偉大的! :) –

+0

或者也許不是,因爲我想保持文件真正的原始值(即可讀)。儘管如此,很高興知道。 – Chrisinpants

4

option開始刪除線(S),追加(aoption newparam到文件

sed -i.bak '/^option/d; $ a\option newparam' somefile.conf 

注的最後一行($):既然你說你要插入新行如果option行不存在,我認爲新行所在的位置並不重要。

1

你可以在GNU做這樣的sed,並保留選項順序:

/^otheroption.*/ { 
    s//otheroption newparam/  # Insert newparam 
    h        # and remember it in HS 
} 
$ { 
    x        # Check if option 
    /^otheroption/! {    # was replaced, 
    x       # if not append it 
    s/$/\notheroption newparam/ # to the last line 
    } 
} 

都在同一行:

sed '/^option.*/ { s//option newparam/; h; }; $ { x; /^option/! { x; s/$/\noption newparam/; }; }' somefile.conf 
+0

這看起來像我之後,但我不能讓代碼執行,雖然我有GNU版本。 – Chrisinpants

+0

@Chrisinpants:你可以提供一些示例輸入,這是行不通的嗎?併發布到問題。 – Thor

+0

我確信代碼沒問題,我只需要花更多時間。 – Chrisinpants