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

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

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

おすすめ記事