与えられた入力:
Via: 1.1.1.1
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 2.2.2.2
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 3.3.3.3
not relevant lines
Via: 4.4.4.4
not relevant
Via: 5.5.5.5
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
not relevant line N
...
希望の出力:
Via: 1.1.1.1
keyword + some text A
keyword + some text A
Via: 2.2.2.2
keyword + some text B
keyword + some text C
Via: 5.5.5.5
keyword + some text D
keyword + some text E
キーワード文字列は、Via ブロックで N 回表示されることも、まったく表示されない場合もあります。出力では、キーワードが属するキーワード文字列とともに表示されるViaブロックのみが必要です。私が見つけた最も近い答えはここしかし、必要なものに置き換えることはできません。
答え1
そしてsed
:
sed -n '/^Via:/{ x; /keyword/p; d; }; /keyword/H; ${ x; /keyword/p; }' input.txt
keyword
または行の先頭に固定したい場合:
sed -n '/^Via:/{ x; /\nkeyword/p; d; }; /^keyword/H; ${ x; /\nkeyword/p; }' input.txt
答え2
アッ解決策:
awk '/^Via:/{ f=1; r=$0; kw=0; next }
f && /keyword/{ printf "%s%s\n",(!kw)? r ORS:"",$0; kw++ }' file
/^Via:/
- 変数で始まる行Via:
をキャプチャしますr
。ブロック処理をf=1
示す「アクティブ」状態にフラグを設定します。Via
kw
- 数量を表示する記号「核心の言葉」Via
各ブロックの下の行f && /keyword/
- ブロックの下の行を処理するときは、パターンに一致する行のみが考慮されVia
ます。keyword
答え3
シンプルで簡単です:
cat input.txt | grep "Via:\|keyword" | grep -B1 "keyword"