所以解析一个文本文件并打印出第1行和第14行,然后对第15-46行不做任何处理,然后打印出第47行和第60行等,直到文件结束。所以基本上每46行,打印出第1和第14行,每46行重复一次,直到EOF
ste*_*ver 12
使用 GNU sed 第一步地址范围扩展:
sed -n '1~46p; 14~46p;' file
Run Code Online (Sandbox Code Playgroud)
Wei*_*hou 11
既然你有 awk
你的标签,我将提供一个解决方案awk
:
awk '(NR%46==1||NR%46==14){print}' file
Run Code Online (Sandbox Code Playgroud)
没有 POSIX 的工作sed
:
sed 'H;1h;$!d;x;y/\n#/#\n/;s/\(#[^#]*\)\{12\}#\([^#]*\)\([^#]*#\)\{33\}/#\2##/g;s/\(.*\)##.*/\1/;s/##/#/g;y/\n#/#\n/'
Run Code Online (Sandbox Code Playgroud)
虽然我认为使用普通 POSIX 是无稽之谈 sed
在其他工具更适合的情况下执行此类任务,但我会添加一个解释,因为这里有您在实际任务中可能需要的有用元素:
H;1h;$!d;x
是在模式空间中收集整个文件的模式,这通常很有用(使用 GNU sed
,您可以使用该-z
选项替换它)。你可以弄清楚它是如何工作的。y/\n#/#\n/
与另一个字符交换换行符(在本例中为#
)。如果您需要诸如“除换行符之外的每个字符”之类的表达式,请在处理之前和之后执行此操作作为解决方法。同样,您不需要它与 GNU sed
,因为[^\n]
那里允许。s
命令中那个奇怪的模式匹配 12+1+33=46 #
(以前的换行符)和 45 [^#]*
,它们是行的内容。每一行都保持原样,删除了 12 个,保留了 1 个,删除了\2
33 个。这是全局完成的。这些##
东西是为了删除尾随行。