Bashのすべての正規表現一致について

Bashのすべての正規表現一致について

私はこのようなものを探しています...

このファイルが与えられたら(「foo.log」と呼びます):

START_OF_ENTRY
line2
END_OF_ENTRY
START_OF_ENTRY
no match
END_OF_ENTRY
START_OF_ENTRY
line2
END_OF_ENTRY

次のコマンドを実行します。

pcregrep -M -o '(?m)^START_OF_ENTRY\nline2\nEND_OF_ENTRY$' foo.log | for match in STDIN; do echo "match: $match"; done

生産します

match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

バッシュでこれは可能ですか?

ベストアンサー1

Bash正規表現マッチングの使用^ちなみに、bashに対応する複数行とアンカーがないようです。$:

x=$(<foo.log)

printf -v re 'START_OF_ENTRY\nline2\nEND_OF_ENTRY'

while [[ $x =~ $re ]]; do 
  printf 'match: %s\n' "${BASH_REMATCH[0]}"; x=${x#*${BASH_REMATCH[0]}};
done
match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

Perlを使用すると、修飾子を使用して複数行のコンテキストでm合計を意味を持たせることができます。^$

perl -0777 -nE 'while ($_ =~ /^(START_OF_ENTRY\nline2\nEND_OF_ENTRY)$/mg) {say "match: $1"}' foo.log

おすすめ記事