删除2个匹配模式之间的n行,键入第一个匹配并删除第二个匹配

use*_*577 3 regex bash awk sed

给定文本文件中的数据:

string1 EP00 37.45 83.83 
save
save
save
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
string2

gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
gibberish
Run Code Online (Sandbox Code Playgroud)

我想使用sedawk匹配string1和string 2,然后删除之后string1的所有内容和前3行.我想删除它string2,但不是string1.并删除该文件与下一文本之间的一行.所以预期的产量是:

string1 EP00 37.45 83.83 
save
save
save
Run Code Online (Sandbox Code Playgroud)

如果这有助于(16),则两个模式之间总有相同数量的行.我想用sed或执行此操作awk,但只能找出一个脚本来删除两者之间的整个数据块,并保留两个字符串:

sed '/string1/,/string2/{//!d}' file >> tr.txt
Run Code Online (Sandbox Code Playgroud)

有谁知道如何指定保留string1它后面的三行并删除两个模式之间的其余行包括string2?我想用sedawk更容易做到这一点.

谢谢!

anu*_*ava 5

你可以使用这个awk:

awk '/^string1/{i=0} /^string1/,/^string2/{i++; if (i<5) print; next}1' file
string1 EP00 37.45 83.83 
save
save
save
Run Code Online (Sandbox Code Playgroud)