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