awkまたはsedを使用して2つのパターン間でテキストを選択する

awkまたはsedを使用して2つのパターン間でテキストを選択する

以下の2つのモードからテキストを選択したいと思います。

入力は次のとおりです。

Blalala
'Omfoem From 
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

これが私が望む結果です:

This is the
text that I want
to get

このスクリプトを試してみました。

awk '/^.*PAT1/{flag=1; next} /.*PAT2/{flag=0} flag' file1.txt

ただし、次の結果のみ出力されます。

text that I want

パターンと同じ行のテキスト部分がありません。

私はOSXを使用しています。

答え1

GNU *バリアント、レコード区切り文字、フィールド区切り文字をawk作成し、最後のフィールドを印刷して出力が重複結果ではないことを確認します。PAT2RSPAT1FSNFRS

awk 'BEGIN{RS="PAT2"; FS="PAT1"}NF>1{print $NF}' file1
 This is the
text that I want
to get 

 This is another text that I want
to get DONE

* @ EdMortonが言及

答え2

GNUの場合、sed見苦しいですが解決できると思います。

sed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/' file | sed -n '/PAT1/,/PAT2/{//!p}'

PAT1とPAT2を取得し、開始と終了に改行を追加します。

sed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/'

Blalala
'Omfoem From 
balanf 
PAT1
 This is the
text that I want
to get 
PAT2
: apples

PAT1とPAT2の間のテキストを印刷します。

sed -n '/PAT1/,/PAT2/{//!p}'

 This is the
text that I want
to get 

答え3

すべてのUNIXシステムのすべてのシェルでawkを使用します。

$ awk 'sub(/.*PAT1 */,""){f=1} f{if ( sub(/ *PAT2.*/,"") ) f=0; print}' file
This is the
text that I want
to get

上記はあなたが提供した入力例に対して機能します。これが適用されない別の形式の他の入力(たとえば、入れ子になった開始/終了文字列、または同じ行の終了文字列の後に続く開始文字列)がある場合は、質問を編集します。これを示します。

答え4

GNUと共にgrep(1)

grep -zoP "(?s)(?<=PAT1 )(.*)(?= PAT2)" file

テスト

$ cat file
Blalala
'Omfoem From
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

$ grep -zoP "(?s)(?<=PAT1 )(.*)(?= PAT2)" file
This is the
text that I want
to get

~からgrep(1)マニュアルページ

-z, --null-data
  Treat the input as a set of lines, each terminated by  a  zero  byte  (the  ASCII NUL  
  character) instead  of  a  newline.  Like the -Z or --null option, this option can be 
  used with commands like sort -z to process arbitrary file names.

-o, --only-matching
   Print  only  the  matched  (non-empty) parts of a matching line, with each such part 
   on a separate output line.

-P, --perl-regexp
   Interpret PATTERN as a Perl regular expression (PCRE, see below).  This is highly 
   experimental and grep -P may warn of unimplemented features.

正規表現の説明:

(?s)activate は、文字や改行文字を探すというPCRE_DOTALL意味です。.

Positive Lookbehindアサーション(?<=PAT1 )とPositive Lookaheadアサーションを使用すると、(?= PAT2)キャプチャグループのみが印刷されます(.*)

このソリューションに関する注意事項:

@bushmanが言ったように、これは両方のパターンがファイルに正確に一度だけ存在する場合にのみ機能します。

関連情報