删除与字符串匹配的行,后跟一行与另一个字符串

时间:2014-08-04 16:16:26

标签: regex sed

所以,我有30000个文件,其中包含一些应删除的额外行。

ATOM   2208  O   LYS   168      12.304 -23.216   0.596  1.00  0.00
ATOM   2209  OXT LYS   168      13.852 -21.707   0.692  1.00  5.19
TER
ATOM   2210  N   ASP   178       2.448 -25.410  -0.746  1.00  5.40
ATOM   2211  HT1 ASP   178       2.706 -25.926   0.119  1.00  0.00
..
TER
END

所以,我想只删除 TER 的行,但后跟一行以 ATOM 开头的新行。因此,如果 TER 后面跟着其他任何内容,我不想删除。

有没有办法用sed做到这一点:

我可以使用此命令,但它会删除 TER

的所有行
sed -i '/^TER/d' myfile

2 个答案:

答案 0 :(得分:3)

我在学习这个答案时学到了很多关于sed的知识,这很酷。

sed -i '/^TER$/{N; s/^TER\nATOM/ATOM/}' test.txt

基本上它找到一条只包含“TER”的行。然后它将下一行附加到此行。如果这个新字符串以“TER”开头,后跟一个新行和“ATOM”,它只用“ATOM”替换它。

我建议不要进行内联编辑,除非你已经进行了备份以防万一。

希望这适合你。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '$!N;/^TER.*\nATOM/!P;D' file

仅打印不以TER开头,后跟ATOM的行。