最简单的方法是在输入文件中建立一个行数组,但仅在不存在 >>updated 时增加数组索引,以便包含 >>updated 的行覆盖数组中的前一个条目,然后只打印内容到达文件末尾时的数组:
$ cat file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III1 <----- I want to remove this
GGG HHH III3 >>updated <----- I want to keep this
JJJ KKK LLL7
$ awk '!/>>updated/{++numLines} {line[numLines]=$0} END {for (nr=1;nr<=numLines;nr++) print line[nr]}' file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3 >>updated <----- I want to keep this
JJJ KKK LLL7
如果您想删除该行上的 >>updated 和后续文本,您可以将测试是否存在更改为尝试删除它的测试:
$ awk '!sub(/ *>>updated.*/,""){++numLines} {line[numLines]=$0} END{for (nr=1;nr<=numLines;nr++) print line[nr]}' file
AAA BBB CCC1
DDD EEE FFF1
GGG HHH III3
JJJ KKK LLL7
如果存在 >>updated 则 sub() 将删除它并返回成功,因此您知道存在 >>updated,否则 sub() 将不执行任何操作,但返回失败,因此您知道 >>updated 不存在。