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'

答え2

grep -oPz "(?s)hi.*?hello" fileName

説明は次のとおりです。

猫TMP

出力->

hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
00000000000
hi ff 
djd h
sdkf hello
dfj 

解決策:

grep -oPz "(?s)hi.*?hello" tmp

出力->

hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello
hi ff 
djd h
sdkf hello

パラメータ:

  • -zこのオプションは、grep に改行文字をプレーンテキスト文字として扱い、レコードを区切るためにヌルバイトを検索するように指示します。ヌルバイトのないテキストファイルでは、grep -zファイル全体が1行として扱われます。

  • (?s)「.」を意味するPCRE_DOTALLを有効にすると、文字または改行文字が見つかります。

  • o一致する部分のみ印刷

  • -P パターンをPerl互換正規表現(PCRE)として解釈します。これは特に-z(--null-data)オプションと組み合わせると非常に実験的であり、「grep -P」は実装されていない機能について警告することができます。

  • .*?貪欲なマッチングのため。hi最初のインスタンスを見つけたら、次の一致を探します。hello

    源泉:https://www.gnu.org/software/grep/manual/grep.html

答え3

いっぱい

#!/usr/bin/awk -f
{
    n=split($0, col, FS)
    for(i=1;i<=n;i++){
        (i==n)? sp="" : sp=FS
        if (col[i] ~ /hi/) p=1
        if (p == 1  && col[i] ~ /hello/) h=1
        if (p == 1) printf("%s%s",col[i],sp)
        if (h==1) p=0;h=0
    }
    printf "\n"
}



kapu@jake:$ cat SourceFile
hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
kapu@jake:$ script.awk SourceFile
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

関連情報