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