根据模式删除行,但保留匹配的前 n 行

Jan*_*ana 9 sed awk text-processing

我需要根据模式从文本文件中删除行,但我需要保留与模式匹配的前 n 行。

输入

% 1 
% 2
% 3
% 4
% 5
text1
text2
text3
Run Code Online (Sandbox Code Playgroud)

输出

%1
%2
text1
text2
text3
Run Code Online (Sandbox Code Playgroud)

我使用了sed /^%/d文件,但它删除了所有以 % 开头的行,sed 3,/^%/d也不起作用。我需要保留模式的前 n 行并删除其余的

Sté*_*las 12

如果要删除所有以 % put 开头的行,保留输入的前两行,可以执行以下操作:

sed -e 1,2b -e '/^%/d'
Run Code Online (Sandbox Code Playgroud)

虽然同样会更清晰awk

awk 'NR <= 2 || !/^%/'
Run Code Online (Sandbox Code Playgroud)

或者,如果您追求性能:

{ head -n 2; grep -v '^%'; } < input-file
Run Code Online (Sandbox Code Playgroud)

如果您想保留与模式匹配的前两行,而它们可能不是输入的第一行,那awk肯定是一个更好的选择:

awk '!/^%/ || ++n <= 2'
Run Code Online (Sandbox Code Playgroud)

使用sed,您可以使用以下技巧:

sed -e '/^%/!b' -e 'x;/xx/{h;d;}' -e 's/^/x/;x'
Run Code Online (Sandbox Code Playgroud)

也就是说,使用保持空间来计算到目前为止匹配的模式的出现次数。不是非常有效或清晰。