如果该行或下一行不包含特定字符串,如何打印该行

ayr*_*nna 9 solaris sed awk 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
Run Code Online (Sandbox Code Playgroud)

期望的输出:

    8B0F
    8AC0
    8AE4
    8AE5
Run Code Online (Sandbox Code Playgroud)

如果该行或下一行不包含“删除”,我想打印一行。我使用的是solaris 5.10,KSH。

don*_*sti 17

sed

sed '$!N;/remove/!P;D' infile
Run Code Online (Sandbox Code Playgroud)

这会将Next 行拉入模式空间(如果不在!la $t 线上)并检查模式空间是否匹配remove。如果没有(意味着模式空间中的两行都不包含字符串remove),它会P打印到第一个\newline 字符(即它打印第一行)。然后它D删除到第一个\newline 字符并重新开始循环。这样,模式空间中永远不会超过两行。


如果在查看模式空间之前和之后添加N, P,D循环可能更容易理解:lN

sed 'l;$!N;l;/remove/!P;D' infile
Run Code Online (Sandbox Code Playgroud)

因此,仅使用示例中的最后六行:

    8AC3
    remove
    8AE4
    8AE5
    8AE6
    remove
Run Code Online (Sandbox Code Playgroud)

最后一个命令输出:

    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)
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

awk '
    !/remove/ && NR > 1 && prev !~ /remove/ {print prev} 
    {prev = $0} 
    END {if (!/remove/) print}
' Input.txt 
Run Code Online (Sandbox Code Playgroud)