4

sed用来替换conf中的行:

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

如果我的选项行在 somefile 中不存在,我如何告诉sed插入它或返回 false?

最后我结束了:

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

4

3 回答 3

4

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

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

注意:由于您说如果option行不存在则要插入新行,因此我认为新行的位置无关紧要。

于 2012-11-10T07:07:01.570 回答
2

使用 grep 检查该行是否首先存在,如果它没有使用双管道运算符将它附加到文件的末尾||。如果第一个命令返回 true,则操作将被短路,因此只有在第一个命令失败时才会执行第二个命令。

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

-q选项抑制 grep 的输出,并且||操作员仅在命令失败时才执行echo命令grep,即 if $?is not 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
于 2012-11-09T23:46:21.090 回答
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
于 2012-11-10T15:56:59.643 回答