Text-Processing
如果該行或下一行不包含特定字元串,如何列印該行
輸入.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
這會將
N
ext 行拉入模式空間(如果不在!
la$
t 行上)並檢查模式空間是否匹配remove
。如果它沒有(意味著模式空間中的兩行都不包含 stringremove
),它會列印P
到第一個\n
ewline 字元(即它列印第一行)。然後它D
刪除到第一個\n
ewline 字元並重新開始循環。這樣,模式空間中的行數不會超過兩行。如果在,之前和之後添加以查看模式空間,可能更容易理解
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)