sed或awk:删除模式后面的n行

Mar*_*llo 91 unix awk sed

我如何在sed(或任何类似的工具 - 例如awk)中混合模式和数值范围?我想要做的是匹配文件中的某些行,并在继续之前删除接下来的n行,我想将其作为管道的一部分.

dog*_*ane 162

我会去看看.

要在模式后删除5行(包括带有模式的行):

sed -e '/pattern/,+5d' file.txt
Run Code Online (Sandbox Code Playgroud)

要在图案后删除5行(不包括带图案的行):

sed -e '/pattern/{n;N;N;N;N;d}' file.txt
Run Code Online (Sandbox Code Playgroud)

  • 在Mac/OS X系统上,您需要在结束括号前添加分号:`sed -e'/ pattern/{n; N; N; N; N; d;}'file.txt` (17认同)
  • 请注意,`+ N`模式是GNU扩展.在第二个示例中将第一个"n"更改为"N",使其包含带有模式的行. (13认同)
  • 发生的情况类似,但每种情况略有不同.在第一个配方中,`/ pattern /,+ 5`定义了一个范围,它以包含"pattern"(`/ pattern /`)的行开头,后来结束5行(`+ 5`).最后一个字符"d"是在该范围内的每一行上运行的命令,即"删除".在第二个配方中,它不是匹配范围,而是仅匹配包含模式的行(`/ pattern /`),然后运行一系列命令:`{n; N; N; N; N; d}` ,它基本上打印下一行(`n`),然后读取并最终丢弃接下来的4行(`N; N; N; N; d`). (7认同)
  • 为了完整起见:要**删除遵循特定模式的所有行**`something`,请执行:`sed -E '/^something$/,$d'`,其中`-E`是 POSIX 可移植性扩展正则表达式。 (3认同)
  • 模式匹配后如何删除所有行?我正在使用 sed -e '/<!--#content end--></div>/,$d' out.txt 但它给出了错误提示:sed: -e expression #1, char 24: extra characters after命令 提前致谢。 (2认同)
  • 在第二种风格中,如何为接下来的 N 行指定一个数字。我必须删除接下来的 52 行,所以写 52 次“N;”很乏味。 (2认同)

mkl*_*nt0 5

简单awk解决方案

假设用于查找匹配行的正则表达式存储在shell变量中$regex,并且要跳过的行数$count.

如果匹配线应该被跳过($count + 1行被跳过):

... | awk -v regex="$regex" -v count="$count" \
  '$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Run Code Online (Sandbox Code Playgroud)

如果匹配线应该被跳过($count线的匹配被跳过):

... | awk -v regex="$regex" -v count="$count" \
  '$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Run Code Online (Sandbox Code Playgroud)

说明:

  • -v regex="$regex" -v count="$count"awk基于同名的shell变量定义变量.
  • $0 ~ regex 匹配感兴趣的线
    • { skip=count; next }初始化跳过计数并进入下一行,有效地跳过匹配行; 在第二个解决方案中,printbefore next确保不会跳过它.
    • --skip >= 0 如果(仍然)> = 0,则递减跳过计数并采取操作,这意味着应该跳过手头的行.
    • { next } 进入下一行,有效地跳过当前行
  • 1是一种常用的简写{ print }; 也就是说,简单地打印当前行
    • 只有非匹配和非跳过的行才能到达此命令.
    • 1相当于的原因{ print }是,它1被解释为一个布尔模式,根据定义,它总是计算为true,这意味着它的关联动作(块)是无条件执行的.由于在这种情况下没有关联的操作,因此awk默认为打印该行.


tha*_*kis 5

没有GNU扩展(例如,在macOS上):

删除图案后的5行(包括带有图案的行)

 sed -e '/pattern/{N;N;N;N;d;}'
Run Code Online (Sandbox Code Playgroud)

添加-i ''以就地编辑。