文字列を検索して、2つのパターン(パターンを含む)間のすべての行を抽出したいと思います。
#1 スタート 名前S 101 フランクフルト_1_1 19号 A+ ストリート 終わり #2 スタート 名前B 104 ベルリン 20 A+ ストリート 終わり スタート #100 名前C 107 ベルリン 20日 A+ ストリート 終わり #24 スタート 名前付き 110 フランクフルト_1_1 20日 A+ 終わり
grep
私がフランクフルトラーメン
その後、STARTとEND(STARTとENDを含む)の間のすべての行を表示する必要があります。たとえば、次のようになります。
#1 スタート 名前S 101 フランクフルト_1_1 19号 A+ ストリート 終わり #24 スタート 名前付き 110 フランクフルト_1_1 20日 A+ ストリート 終わり
私が使用したコマンドは次のとおりです。
猫ファイルawk '/START/,/END/' | grep -p フランクフルト
しかし、それはうまくいきませんでした。
答え1
検索は複数行に基づいているため、awkがその操作に適したツールであるかどうかはわかりません。私はこれがPerlの仕事だと思います。利用可能なファイルを参照するには(awkステートメントに似ています):
if (/^START/ .. /^END/){}
そこから行を配列に保存し、フランクフルトが満たされたら行を印刷します(ここではブール値を使用)。
push @lines, $_;
if (/Frankfurt/)
$toPrint = 1;
いずれの場合も、パターンから出るときにブール値が true の場合は配列を印刷し、それ以外の場合は印刷せずに配列を消去します。
答え2
私たちは間違いなく使用できますawk
。これを試してください
awk -v RS="END" '$0~/フランクフルト/{print $0 RS}' ファイル