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


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

上記の行で、私が欲しいのはgrep/ sed/ awk(どのメソッドでもかまいません)&記号とその上に1行追加された行です。たとえば、必要な出力は次のようになります。

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

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

egrep "&" | -b 1 file.txt

回答:


16

できるよ:

grep -B 1 '&$' your_file

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

-Bスイッチは伝えgrep試合その行の前に来る出力「コンテキスト」の行に。この場合、1行のコンテキストが必要なので、が必要-B 1です。

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

以下sedは、GNUを持っていない場合に役立つ簡単なソリューションですgrep

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

使い方

  • -nスイッチは、デフォルトの「印刷」アクションを抑制しますsed
  • /&/!Nつまり、現在の行にが含まれていない場合は&、次の行をパターンスペースに追加します。
  • /&/pつまり&、パターンスペースを一致させて印刷します。

2
@RanaKhan Stack Exchangeへようこそ:)お役に立ててよかったです。問題の解決に役立った場合は、この回答に承認済みのマークを付けることを忘れないでください(回答の横にある投票ボタンの下のチェックマークを使用)。これにより、サイトを閲覧している他の人がこの問題が解決されたことがわかります。
ジョセフR.

バリアントGNU/grepが利用できない場合は+1 、ありがとう!
ckujau

3

でエミュレートする方法grep -B1sed次のとおりです。

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

これはこちらのものとよく似ています。もう1つと同様に、Next行で読み取りますが、今回は、パターンスペースが一致する場合P最初の\newline までリントし、次に、もう1つと同様に、最初のewline まで削除して、サイクルを再開します。したがって、サンプル入力では: D\n

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.