その行または次の行に特定の文字列が含まれていない場合は、その行を印刷する方法

その行または次の行に特定の文字列が含まれていない場合は、その行を印刷する方法

入力.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

その後、Nextラインがパターンスペースに引っ張られ(!lat$ラインでない場合)、パターンスペースが一致することを確認しますremove。存在しない場合(パターン空間のどの行にも文字列が含まれていないことを意味)、最初のewline文字で印刷されますremove(つまり、最初の行を印刷します)。その後、最初の改行文字を削除し、ループを再開します。このように、パターン空間には複数の行がありません。P\nD\n


ループの前後に次を追加してパターンスペースを調べると、理解しやすくなりますNPDlN

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

関連情報