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


8

Input.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

その行または次の行に「削除」が含まれていない場合、その行を印刷したい。私はソラリス5.10、KSHを使用しています。


@don_crisstiありがとう、コメントではなく回答を投稿すると、この質問に回答済みのマークを付けることができます。
ayrton_senna 2015

回答:


14

sed

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

これは、プルNのextパターンスペースに行(いない場合は!ラ上の$パターンスペースが一致する場合トンライン)とチェックをremove。含まれていない場合(パターンスペースの2行に文字列が含まれていないことを意味しますremoveP、最初の\newline文字までリントします(つまり、最初の行を印刷します)。次にD、最初の\newline文字まで削除し、サイクルを再開します。このように、パターンスペースには2行を超える行はありません。


それは理解することは、おそらく簡単ですNPDあなたが追加した場合、サイクルを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
gawk 'BEGIN{ RS="remove\n"; ORS="" }
      RT{ print gensub("[^\n]*\n$","","") }; !RT{ print }' file

上記の方法は、レコードを読み取るないライン・バイ・ラインは、むしろそれを読み取り、マルチライン次に一つのレコードセパレータ(RS)からレコードを(またはエンドオブファイル) - RSなどである「削除」線自体(その末尾の `\ n)。

!RTテストは最後の行がないときのために必要とされているRSライン。
RTgawkの-ISMは、現在のレコードの実際のテキストですRS
gensubまた、gawk-ismです。

あなたがいることを、マーカーラインをチェックする必要がある場合はマッチラインで「削除」どこでも、ライン対等しい「削除」を、そしてちょうどにレコードセパレータを変更します。

`RS="[^\n]*remove[^\n]*\n"`  

出力:

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