zzzzzzzzz
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
ddddddddd
hhhhhhhhh
eeeeeeeee
fffffffff &
ggggggggg &
上記の行では、grep
/sed
/awk
(どのメソッドでも問題ありません)の行に&
記号とその上に1行。たとえば、必要な出力は次のようになります。
aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &
以下は私が運なしで試したことです。
egrep "&" | -b 1 file.txt
できるよ:
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
は、&
に一致し、パターンスペースを出力することを意味します。sed
でgrep -B1
をエミュレートする方法は次のとおりです:
sed '$!N;/pattern/P;D' infile
ここに1つ とよく似ています。他のものと同様に、N
ext行を読み取りますが、今回はP
rintsから最初の\n
ewlineifパターンスペースmatches、次に、他のものと同様に、D
eletesまで最初の\n
ewlineし、サイクルを再開します。したがって、サンプル入力では:
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