1. ホーム
  2. regex

[解決済み] sed を使って 2 つのマッチするパターンの間のすべての行を削除する

2023-03-29 04:59:50

質問

以下のようなファイルを持っています。

# ID 1
blah blah
blah blah
$ description 1
blah blah
# ID 2
blah
$ description 2
blah blah
blah blah

の間のすべての行を削除するには、sed コマンドをどのように使用すればよいですか? #$ という行になるのでしょうか?ということで、結果はこうなります。

# ID 1
$ description 1
blah blah
# ID 2
$ description 2
blah blah
blah blah

説明もよろしくお願いします。

どのように解決するのですか?

このsedコマンドを使って実現します。

sed '/^#/,/^\$/{/^#/!{/^\$/!d}}' file.txt

Macユーザー( extra characters at the end of d command エラーを防ぐため) 閉じ括弧の前にセミコロンを追加する必要があります。

sed '/^#/,/^\$/{/^#/!{/^\$/!d;};}' file.txt

出力

# ID 1
$ description 1
blah blah
# ID 2
$ description 2
blah blah
blah blah

説明

  • /^#/,/^\$/ で始まる行の間のすべてのテキストにマッチします。 # で始まる行と $ . ^ は行頭文字として使われます。 $ は特殊文字であるため、エスケープする必要があります。
  • /^#/! は、行頭が #
  • /^$/! は、行頭が $
  • d は削除を意味します。

つまり、全体として、最初に ^# から ^\$ という行を探し、その一致した行から にマッチしない ^# は一致しません。 ^\$ で削除し d .