パターンに一致するすべての行を検索し、その上の行だけを印刷します。

パターンに一致するすべての行を検索し、その上の行だけを印刷します。

文字列を見つけて、その上の行を印刷する必要があります。

ケース 1: 同じ行に複数の一致するパターンがありません。

つまり、以下を含むファイルを考えてみましょう。

$cat > para
returns between the paragaraphs
italic or bold    
quotes by placing
italic

ここでイタリック体を探し、以下のように出力を得る必要があります。

段落の間に戻る
見積を出して

どのようにそのような結果を得ることができますか?

ベストアンサー1

一致するテキストの文脈では、「パターン」という単語は非常にあいまいなので、使用しないでください。一致を参照する項目のうち、少なくとも「文字列」または「正規表現」と「部分」または「完全」を常に使用してください。バラよりhttps://stackoverflow.com/q/65621325/1745001より多くの情報を知りたいです。

あなたの質問はあなたが望む一致の種類を知ることができないので、次は公開されたサンプル入力に基づいて公開された期待される出力を生成するいくつかの例です。できます。 :

部分行正規表現の一致:

$ awk '/italic/{print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

部分行文字列の一致:

$ awk 'index($0,"italic"){print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

部分フィールド正規表現の一致:

$ awk '{for (i=1; i<=NF; i++) if ($i ~ /italic/) print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

部分フィールド文字列の一致:

$ awk '{for (i=1; i<=NF; i++) if (index($i,"italic")) print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

全フィールド正規表現の一致

a)単語の境界にGNU awkを使用):

$ awk '/\<italic\>/{print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

b) awk を使用します。

$ awk '/(^|[[:space:]])italic([[:space:]]|$)/{print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

完全なフィールド文字列の一致:

a) ループを使用します。

$ awk '{for (i=1; i<=NF; i++) if ($i == "italic") print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

b)ループと正規表現のサポートなし:

$ awk 's=index($i,"italic") && (substr($0,s-1,1) ~ /^|[[:space:]]/) && (substr($0,s+length("italic"),1) ~ /[[:space:]]|$/){print p} {p=$0}' file
returns between the paragaraphs
quotes by placing

上記のすべての項目は、公開された入力例に基づいて予想される出力を生成し、文字列と正規表現、正確な一致と部分一致の要件によって入力が異なる場合、上記のすべての項目は失敗します。

おすすめ記事