web-dev-qa-db-ja.com

試合と試合の前の1行をgrep

zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &

上記の行では、grep/sed/awk(どのメソッドでも問題ありません)の行に&記号とその上に1行。たとえば、必要な出力は次のようになります。

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

以下は私が運なしで試したことです。

egrep "&" | -b 1 file.txt
8
Rana Khan

できるよ:

grep -B 1 '&$' your_file

これは&で終わる行を探し、$を削除して、行内の&と一致します。

-Bスイッチは、一致する行の前にある「コンテキスト」行を出力するようにgrepに指示します。この場合、1行のコンテキストが必要なので、-B 1が必要です。

このスイッチはGNU grepで使用できますが、POSIX標準では使用できません。

GNU sedがない場合に役立つ、シンプルなgrepソリューションを次に示します。

sed -n '/&/!N;/&/p' your_file

仕組み

  • -nスイッチは、sedのデフォルトの「印刷」アクションを抑制します
  • /&/!Nは、現在の行に&が含まれていない場合、次の行をパターンスペースに追加することを意味します。
  • /&/pは、&に一致し、パターンスペースを出力することを意味します。
16
Joseph R.

sedgrep -B1をエミュレートする方法は次のとおりです:

sed '$!N;/pattern/P;D' infile

ここに1つ とよく似ています。他のものと同様に、Next行を読み取りますが、今回はPrintsから最初の\newlineifパターンスペースmatches、次に、他のものと同様に、Deletesまで最初の\newlineし、サイクルを再開します。したがって、サンプル入力では:

sed '$!N;/&/P;D' infile

出力:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

繰り返しますが、動作を確認するには、lの前後にNを追加して、パターンスペースを確認します。

sed 'l;$!N;l;/&/P;D' infile

例えばサンプルファイルで:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

これらは、sedが実行するコマンドと対応する出力です。

cmd出力cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
3
don_crissti