以下を行う必要があります。
「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'