grep

grep

以下を行う必要があります。

「hi」と「hello」パターンの間にテキストを印刷します。

パターンを繰り返すことも、複数回表示することもできますhihello

ソースファイル:

hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff

期待される出力。

hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

awkandコマンドを試しましたが、sed -n最初の項目と最後の項目の間のすべての行が表示されます。hihello

ベストアンサー1

~から最初こんにちは最初こんにちは次です。

grep

(GNU)grepとtrの使用:

$ <infile grep -oPz "(?s)hi.*?hello" | tr '\0' '\n'
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

説明する:

  • <infileソースファイル。
  • grep -oPz 呼ぶgrep
    • -P)は次のように一致します。商業用不動産(Perl互換正規表現)
    • ( -o)ああ一致する部分だけが印刷されます。
    • -z)を使うeroバイト(別名NULと別名\0)を行区切り文字として使用します。
  • "(?s)PCRE点(.)も改行文字と一致するようにします。
  • hi文字列で始めますhi
  • .*?次の文字とすべて一致します(そのため、貪欲ではありません?)。
  • hello"文字列がhello一致するまで。
  • | tr '\0' '\n'NUL( \0) バイトをgrep -z改行文字に変換します。

sed

GNU sed:

<infile sed 's/hi/\n&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

\nまたは、右側を許可しないBSD sedの場合は変数を定義する必要がs///あります。newlinenl

$ eval "$(printf "nl='\n'")"

それから:

<infile sed 's/hi/\'"$nl"'&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

または明示的な改行文字を作成できる場合:

<infile sed 's/hi/\
&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

おすすめ記事