特定の行間のすべての項目を一致させるために正規表現を使用したいのですが、開始と終了は一致しません。私にとって、それは肯定的な振り返りと肯定的な見通しのように聞こえます。
start text
bla bla
bla
end
これらのブロックは複数あるので、すべて抽出し、各ブロックに対して異なる正規表現に基づいて何かを抽出したいと思います。したがって、次のようにする必要があります。
match start
then match everything until the first occurrence of end
match start
then match everything until the first occurrence of end
など...
だから私は次のようにしました:(?<=start)。*(?=end)
ファイルを一連の行として扱い、各行に正規表現を適用しようとするコマンドラインgrepを使用すると考えたため、これは機能しません。ファイルを完全な行として処理する方法はありますか?それともこれは良い解決策ではなく、sedを使用してテキストを抽出し、接続を含む行でファイルを作成するなど、さまざまなコマンドラインツールの組み合わせを使用する必要があります。初期文書の行?
答え1
a'rが私よりも先にsedソリューションを見つけたので、それに対応するperlソリューションを公開します。
perl -ne 'print if/start/../end/'
ちょっと長いですが。
答え2
この場合、sedはより簡単になります。
sed -ne '/start/,/end/p'
別のsed式は、一致する行を一緒に結合します。
sed -ne '/start/ba; be;' \
-e ':a; N; /end/{s/\n/ /g; p; be;}; ba' \
-e :e
a
行が一致すると最初の部分はラベルに分岐し/start/
、そうでなければe
(end)に分岐します。
2番目の部分は、行を繰り返しながら一致する行が見つかるまでパターンスペースに追加し/end/
、新しい行を空白に置き換え、その行を印刷してe
(最後)に分岐します。
3番目の部分はラベルのみを提供しますe
。