以下を行う必要があります。
「hi」と「hello」パターンの間にテキストを印刷します。
パターンを繰り返すことも、複数回表示することもできますhi
。hello
ソースファイル:
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
awk
andコマンドを試しましたが、sed -n
最初の項目と最後の項目の間のすべての行が表示されます。hi
hello
答え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///
あります。newline
nl
$ 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
答え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