Sed 命令每 46 行打印一次文件的第 1 行和第 14 行

Sed 命令每 46 行打印一次文件的第 1 行和第 14 行

因此,解析一个文本文件并打印出第 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是一种在模式空间中收集整个文件的模式,这通常很有用(使用 GNU sed,您可以使用 选项替换它-z)。你可以弄清楚它是如何工作的。
  • y/\n#/#\n/与另一个字符交换换行符(在本例中#)。如果您需要诸如“除换行符之外的每个字符”之类的表达式,请在处理之前和之后执行此操作作为解决方法。同样,您不需要 GNU 的它sed,因为[^\n]那里是允许的。
  • 命令中的奇怪模式s匹配 12+1+33=46 #(以前的换行符)和 45 [^#]*,它们是行内容。每一行均保持不变,删除了 12 行,保留了 1 行,\2删除了 33 行。这是全球范围内完成的。这些##东西是为了删除尾随行而完成的。

相关内容