请帮助 - 我的sed / awk / grep非常生疏,并且我正在尝试处理文件(导出大约4700页的PDF文件)。
以下是我尝试做的事情:搜索/打印行匹配模式1,搜索行匹配模式2并打印该行以及所有行直到模式3(如果它包含/打印行模式3,此时我对它好了),搜索/打印匹配模式4的行。
所有上述模式都应按顺序(模式1,2,3,4)在文件中发生几百次,我需要将它们按顺序排列。
模式1:以1-5开头的行和一个空格(虽然它看似含糊不清,但这个具体足够) 模式2:以(全部大写)开头的行解决方案: 模式3:以(全部大写)开头的行符合: 模式4:以IP地址开头的行
这是我拼凑的东西,但它显然不起作用:
#!/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
答案 0 :(得分:1)
要在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
答案 1 :(得分:1)
你可能想要这样的东西,未经测试,因为你没有提供任何样本输入或预期输出:
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