8

私はスクリプト作成が初めてで、2 つの異なるパターンの間に存在するテキストを抽出する方法を学ぼうとしていました。ただし、次のシナリオで 2 つのパターン間でテキストを抽出する方法をまだ理解できていません。

入力ファイルを読んでいる場合:

Hi I would like
to print text
between these 
patterns

私の予想される出力は次のようなものです:

I would like
to print text
between these 

つまり、最初の検索パターンは「こんにちは」で、このパターンをスキップしますが、一致したパターンに続く同じ行に存在するすべてを出力します。2 番目の検索パターンは「パターン」であり、この行またはそれ以降の行を完全に出力しないようにしたいと考えています。それ。

私は次のことを試しました:

sed -n '/Hi/,/patterns/p' test.txt 

[出力]

Hi I would like
to print text
between these 
patterns 

次に、私は試しました:

`awk ' /'"Hi"'/ {flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt 

[出力]

to print text
between these

誰かがこれを達成する方法を特定するのを手伝ってくれますか? 前もって感謝します

4

4 に答える 4

7

ミニ ステート マシンの正しいアイデアはありawkますが、次のトランスクリプトのように若干の変更が必要です。

pax> echo 'Hi I would like
to print text
between these 
patterns ' | awk '
    /patterns/ { echo = 0 }
    /Hi /      { gsub("^.*Hi ", "", $0); echo = 1 }
               { if (echo == 1) { print } }'

または、圧縮形式で:

awk '/patterns/{e=0}/Hi /{gsub("^.*Hi ","",$0);e=1}{if(e==1){print}}'

その出力は次のとおりです。

I would like
to print text
between these 

要求どおり。

これが機能する方法は次のとおりです。このecho変数は、最初は0エコーが発生しないことを意味しています。

各行が順番にチェックされます。が含まれている場合patterns、エコーは無効になります。

スペースが続く場合Hi、エコーがオンになり gsub、行を変更してHi.

次に、関係なく、echoフラグがオンの場合、行 (変更されている可能性があります) がエコーされます。

現在、次のようなエッジケースがあります。

  • Hi;が 2 回出現する行。また
  • の前に何かを含む行patterns

どのように処理すべきかを指定していないので気にしませんでしたが、基本的な概念は同じはずです。

于 2012-10-23T04:37:02.933 に答える
3

行「パターン」を削除するようにソリューションを更新しました。

$ sed -n '/^Hi/,/patterns/{s/^Hi //;/^patterns/d;p;}' file
I would like
to print text
between these
于 2012-10-23T04:36:53.747 に答える
1

行頭で Hi を見つけて置換するときにフラグ (f) を設定し、パターンを見つけたらクリアし、フラグが設定されているときにデフォルトの印刷を呼び出します。

$ awk 'sub(/^Hi /,""){f=1} /patterns/{f=0} f'  file
I would like
to print text
between these
于 2012-10-23T18:11:33.690 に答える