一致後に1つの同様の行を置き換える方法

一致後に1つの同様の行を置き換える方法

特定の項目を検索し、次の項目のみを置き換えよ[7_addons]うとしています。enabled=0enabled=1

この例では、次のようになります。

sed -i -e 's#enabled=0#enabled=1#g' /etc/file.txt

enabled=0..replaceに表示されているすべてのコンテンツですが、検索文字列の後に続くものだけを置き換えて、に置き換えて停止したいとfile.txt思います。7_addons=0=1

答え1

enabled最初の行以降に存在すると想定されるファイルの行を置き換えるには、ed![7_addons]

ed -s input <<< $'/^\[7_addons\]$\n/^enabled=0\nc\nenabled=1\n.\nw\nq' > /dev/null

外部から起動し、ファイルedのスクリプトモードで実行され、inputANSI引用符付き文字列をhere文字列に渡し、出力を/ dev / nullにリダイレクトします。 / dev / nullリダイレクトは、操作中に見つかった行のレポートを削除します。

ここの文字列は\n- で区切られ、次のコマンドで区切られます。

  1. /^\[7_addons\]$- 行の[7_addons]先頭(^)と終わり()で正確に行を検索します。$
  2. /^enabled=0$-それから次の行を前方に検索します。enabled=0
  3. c- この行を変更してください
  4. enabled=1——この記事の場合
  5. .- 代替テキストの終わり
  6. w--ディスクにファイルを書き込む
  7. q——編集終了

この入力例では、次のようになります。

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=0
other=bat
[8_addons]
foo=quux

生成されたファイルは次のとおりです。

[1_addons]
enabled=0
foo=bar
[7_addons]
foo=baz
enabled=1
other=bat
[8_addons]
foo=quux

答え2

sed '/\[7_addons\]/{n;s/enabled=0/enabled=1/}'

[7_addons]またはとの間に異なる行がある場合enabled=0

sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/'

例:

$ cat foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=0
enabled=0
$ sed '/\[7_addons\]/,/enabled=/s/enabled=0/enabled=1/' foo
[2_foo]
enabled=0
[7_addons]
extra fluff
enabled=1
enabled=0

正規表現をより厳密にしたいと思うかもしれません。質問のデータに基づいてそれを行うことはできません。

関連情報