4

私はsedconfの行を置き換えるために使用しています:

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 を返した場合、操作は短絡されます。したがって、2 番目のコマンドは、最初のコマンドが失敗した場合にのみ実行されます。

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

この-qオプションは grep の出力を抑制し、||オペレーターはコマンドが失敗した場合、つまりis notechoの場合にのみコマンドを実行します。簡単な例: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
于 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 
  }
}

すべて 1 行で:

sed '/^option.*/ { s//option newparam/; h; }; $ { x; /^option/! { x; s/$/\noption newparam/; }; }' somefile.conf
于 2012-11-10T15:56:59.643 に答える