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

Nic*_*ree 4 sed awk

所以解析一个文本文件并打印出第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)

  • `awk 'NR%46==1||NR%46==14' file` 就足够了,因为 awk 在满足条件时会触发一个 `{print $0}`。 (3认同)

Phi*_*pos 5

没有 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 个,删除了\233 个。这是全局完成的。这些##东西是为了删除尾随行。

  • 对这种魔法咒语的解释将不胜感激。 (2认同)