以下の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
作成し、最後のフィールドを印刷して出力が重複結果ではないことを確認します。PAT2
RS
PAT1
FS
NF
RS
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が言ったように、これは両方のパターンがファイルに正確に一度だけ存在する場合にのみ機能します。