我如何在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)
简单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默认为打印该行.没有GNU扩展(例如,在macOS上):
删除图案后的5行(包括带有图案的行)
sed -e '/pattern/{N;N;N;N;d;}'
Run Code Online (Sandbox Code Playgroud)
添加-i ''以就地编辑。