[英]If no sed pattern echo >> newline
我正在使用sed
替換conf中的行:
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
刪除以option
開頭的行,將( a
) option newparam
追加到文件的最后一行( $
)
sed -i.bak '/^option/d; $ a\option newparam' somefile.conf
注意:既然您說如果option
行不存在則要插入新行,我假設新行所在的位置無關緊要。
如果使用雙管道運算符||
將行附加到文件末尾,請使用grep檢查該行是否先存在 。 如果第一個命令返回true,則操作將被短路,因此,如果第一個命令失敗,則僅執行第二個命令。
grep -q '^option.*' file.txt || echo 'option newparam' >> file.txt
-q
選項禁止輸出grep和||
如果grep
命令失敗,operator只會執行echo
命令,即$?
不是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
你可以在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.