入力.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
希望の出力:
8B0F
8AC0
8AE4
8AE5
その行または次の行に「削除」が含まれていない場合は、その行を印刷したいと思います。私はSolaris 5.10、KSHを使用しています。
答え1
そしてsed
:
sed '$!N;/remove/!P;D' infile
その後、N
extラインがパターンスペースに引っ張られ(!
lat$
ラインでない場合)、パターンスペースが一致することを確認しますremove
。存在しない場合(パターン空間のどの行にも文字列が含まれていないことを意味)、最初のewline文字で印刷されますremove
(つまり、最初の行を印刷します)。その後、最初の改行文字を削除し、ループを再開します。このように、パターン空間には複数の行がありません。P
\n
D
\n
ループの前後に次を追加してパターンスペースを調べると、理解しやすくなりますN
。P
D
l
N
sed 'l;$!N;l;/remove/!P;D' infile
したがって、例の最後の6行を使用してください。
8AC3
remove
8AE4
8AE5
8AE6
remove
最後のコマンド出力:
8AC3$ 8AC3\n $ 削除 $削除 削除\n 8AE4$ 8AE4$ 8AE4\n 8AE5$ 8AE4 8AE5$ 8AE5\n 8AE6$ 8AE5 8AE6$ 8AE6\n $ 削除 $削除 $削除
簡単な説明は次のとおりです。
cmd 出力 cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)
答え2
awk '
!/remove/ && NR > 1 && prev !~ /remove/ {print prev}
{prev = $0}
END {if (!/remove/) print}
' Input.txt
答え3
gawk 'BEGIN{ RS="remove\n"; ORS="" }
RT{ print gensub("[^\n]*\n$","","") }; !RT{ print }' file
上記の方法はレコードを読みません。一行ずつ、代わりに次のように読みます。複数行1つのレコード区切り文字(RS)から次(またはファイルの終わり)までのレコードは、行RS
自体(末尾の `\ nを含む)を「削除」することです。
!RT
最後の行が行でない場合はテストする必要がありますRS
。
RT
、ㅏ愚か者は現在のレコードの実際のテキストですRS
。
gensub
また愚か者。
表示された線を確認する必要がある場合マッチ1行ではなく1行のどこからでも「削除」同じ「削除」してから、レコード区切り文字を次のように変更します。
`RS="[^\n]*remove[^\n]*\n"`
出力:
8B0F
8AC0
8AE4
8AE5