私はこのようなものを探しています...
このファイルが与えられたら(「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