で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 が削除され#
、そうでなければ修正されていないパターン空間だけが印刷されます。#bar
foo
確かに/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'