Regex Bash脚本打印模式1,搜索并打印模式2到模式3的所有行,以及打印模式4
请帮助-我对我的sed/awk/grep非常生疏,我正在尝试处理一个文件(大约4700页长的PDF导出) 以下是我试图做的:搜索/打印与模式1匹配的行,搜索与模式2匹配的行,并打印该行以及从该行到模式3的所有行(如果它包括/打印与模式3匹配的行,此时我同意),以及搜索/打印与模式4匹配的行 上面所有的模式都应该在文件中按顺序出现几百次(模式1、2、3、4),我需要保持它们的顺序 模式1:以1-5和空格开头的行(尽管看起来很模糊,但这足够具体) 模式2:以(所有封口)溶液开头的线条: 模式3:以(所有CAP)合规性开头的行: 模式4:以IP地址开头的行 以下是我拼凑的东西,但显然不起作用:Regex Bash脚本打印模式1,搜索并打印模式2到模式3的所有行,以及打印模式4,regex,linux,bash,awk,sed,Regex,Linux,Bash,Awk,Sed,请帮助-我对我的sed/awk/grep非常生疏,我正在尝试处理一个文件(大约4700页长的PDF导出) 以下是我试图做的:搜索/打印与模式1匹配的行,搜索与模式2匹配的行,并打印该行以及从该行到模式3的所有行(如果它包括/打印与模式3匹配的行,此时我同意),以及搜索/打印与模式4匹配的行 上面所有的模式都应该在文件中按顺序出现几百次(模式1、2、3、4),我需要保持它们的顺序 模式1:以1-5和空格开头的行(尽管看起来很模糊,但这足够具体) 模式2:以(所有封口)溶液开头的线条: 模式3:以(
#!/bin/bash
#
sed '
/^[1-5]\s/p {
/^SOLUTION/,/^COMPLIANCE/p {
/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p }
}' sample.txt
要在sed中使用
p
,您还需要使用-n
,并为扩展正则表达式添加-r
:
下面是它的外观:
sed -r -n '{
/^[1-5] /p
/^SOLUTION/,/^COMPLIANCE/p
/^([0-9]{1,3}[\.]){3}[0-9]{1,3}/p
}' sample.txt
您可能想要这样的东西,未经测试,因为您没有提供任何示例输入或预期输出:
awk '
BEGIN { state = 0 }
/^[1-5] / { if (state ~ /[01]/) { block = $0; state = 1 } }
/^SOLUTION/ { state = (state ~ /[12]/ ? 2 : 0) }
state == 2 { block = block ORS $0 }
/^COMPLIANCE/ { state = (state == 2 ? 3 : state) }
/^([0-9]{1,3}\.){3}[0-9]{1,3}/ { if (state == 3) { print block ORS $0; state = 0 } }
' file
将
sample.txt
中的几行添加到您的问题中。grep用于在文件中查找RE并打印匹配行。sed用于对文件中的各行进行简单替换。对于其他任何东西,您都应该使用awk。发布一些示例输入和预期输出,我们可以帮助您。例如,如果您点击了以数字1-5开头的两行,并且在以“解决方案”开头的第一行之前有一个空格,该怎么办?你忽略了第一个还是什么?找到匹配的行总是很简单的,处理看起来相似但不匹配的行是很复杂的,所以创建示例输入来说明这一点。我确实刚刚让它工作起来,但实际上我更喜欢你的IP地址方法。非常感谢!不管满足条件的顺序如何,这难道不会打印出与每个条件匹配的行吗?不,他特别说以上所有模式都应该在文件中按顺序(模式1,2,3,4)出现几百次,我需要保持它们的顺序。
@EdMorton好的,但他的情况下实际的区别是什么?若线从数字和空格开始,它不能匹配任何其他模式。所以在我的例子中,我们只打印模式1匹配,然后模式2到3匹配,然后模式4匹配。明白了,但这只是冰山一角,我怀疑OP还没有真正考虑到雨天的情况。