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