Text-Processing

如果該行或下一行不包含特定字元串,如何列印該行

  • August 22, 2015

輸入.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。

sed

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

這會將Next 行拉入模式空間(如果不在!la $t 行上)並檢查模式空間是否匹配remove。如果它沒有(意味著模式空間中的兩行都不包含 string remove),它會列印P到第一個\newline 字元(即它列印第一行)。然後它D刪除到第一個\newline 字元並重新開始循環。這樣,模式空間中的行數不會超過兩行。


如果在,之前和之後添加以查看模式空間,可能更容易理解N, P,循環:D``l``N

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

因此,僅使用範例中的最後六行:

   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 輸出命令
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)

引用自:https://unix.stackexchange.com/questions/216544