如果没有sed模式回波>>新队

时间:2012-11-09 23:28:21

标签: bash sed

我正在使用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

3 个答案:

答案 0 :(得分:4)

删除以option开头的行,将aoption newparam追加到文件的最后一行($

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

注意:既然您说如果option行不存在则要插入新行,我认为新行所在的位置并不重要。

答案 1 :(得分: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

答案 2 :(得分: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