簡體   English   中英

如果沒有sed模式echo >>換行符

[英]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開頭的行,將( aoption 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM