用于打印图案1的Bash脚本,搜索并打印从图案2到图案3的所有行,以及打印图案4

时间:2014-12-17 21:24:32

标签: regex linux bash awk sed

请帮助 - 我的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

2 个答案:

答案 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