sedを使用してパターンの後の次の行を編集するには?

sedを使用してパターンの後の次の行を編集するには?

sed終わる行を検索しfooた後で始まる次の行を編集するにはどうすればよいですか#bar

つまり、#次の行がで始まり、前の行がで終わる場合は、次の行#barのコメントを削除したいと思います。foo

たとえば、

This is a line ending in foo
#bar is commented out
There are many lines ending in foo
#bar commented out again

私は試した:

sed -i 's/^foo\n#bar/foo\nbar/' infile

答え1

sed '/foo$/{n;s/^#bar/bar/;}'

お客様のリクエストを文字通り翻訳したものです。nですnext

これで、次のような場合は機能しません。

line1 foo
#bar line2 foo
#bar

または:

line1 foo
line2 foo
#bar

nパターン空間にドラッグした線は検索されないためですfoo

次の行をパターン空間にインポートしてから、最初に再度繰り返すことでこの問題を解決できます。

sed '
  :1
  /foo$/ {
     n
     s/^#bar/bar/
     b1
  }'

答え2

使用N;P;D繰り返し、各置換を試みます。

sed '$!N;s/\(foo\n\)#\(bar\)/\1\2/;P;D' infile

で終わる行の後に来る場合にのみ先行 from が削除され#、そうでなければ修正されていないパターン空間だけが印刷されます。#barfoo


確かに/etc/pacman.d/mirrorlist、まったく異なるアメリカのミラーのコメントを削除しようとしています。

sed -e '/United States/,/^$/{//!s/^#//' -e '}' /etc/pacman.d/mirrorlist

これにより、USセクションのすべてのミラーコメントが削除されます。/etc/pacman.d/mirrorlist

答え3

努力する:

sed -e '$!N;/foo\n#bar/s/\(\n\)#/\1/;P;D'

関連情報