【问题标题】:Bash script to print pattern 1, search and print all lines from pattern 2 through Pattern 3, and print pattern 4用于打印模式 1 的 Bash 脚本,搜索并打印从模式 2 到模式 3 的所有行,并打印模式 4
【发布时间】:2015-02-16 13:30:54
【问题描述】:

请帮助 - 我对我的 sed/awk/grep 非常生疏,我正在尝试处理一个文件(导出的 PDF 大约 4700 页长)。

这是我正在尝试做的:搜索/打印匹配模式 1 的行,搜索匹配模式 2 的行并打印该行以及从该行到模式 3 的所有行(如果它包含/打印具有模式 3 的行,我现在可以了),并搜索/打印匹配模式 4 的行。

上述所有模式都应该在文件中按顺序(模式 1、2、3、4)出现数百次,我需要保持它们的顺序。

模式 1:以 1-5 开头的行和一个空格(尽管看起来很模糊,但这已经足够具体了) 模式 2:以(全部大写)开头的行 解决方案: 模式 3:以(全部大写)COMPLIANCE 开头的行: 模式 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

【问题讨论】:

  • sample.txt 中的几行添加到您的问题中。
  • grep 用于在文件中查找 RE 并打印匹配的行。 sed 用于对文件中的各个行进行简单替换。对于其他任何事情,您应该只使用 awk。发布一些示例输入和预期输出,我们可以为您提供帮助。例如,如果您点击了以数字 1-5 开头的 2 行,并且在以 SOLUTION 开头的第一行之前有一个空格怎么办?你忽略第一个还是什么?找到匹配的行总是微不足道的,它处理看起来相似但不匹配的行很复杂,所以创建您的示例输入以显示 THAT。

标签: regex linux bash awk sed


【解决方案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

【讨论】:

  • 我真的只是让它工作,但我实际上更喜欢你的 IP 地址方法。非常感谢!
  • 不管满足条件的顺序如何,都不会打印匹配每个条件的行吗?
  • 不是,他特意说All of the above patterns should occur in order (pattern 1,2,3,4) several hundred times in the file and I need to keep them in order.
  • @EdMorton 好的,但他的情况有什么实际区别?如果行从数字和空格开始,则它不能匹配任何其他模式。所以在我的例子中,我们只打印模式 1 匹配,然后模式 2 到 3 匹配 amd 然后模式 4 匹配。
  • 明白,但这只是冰山的最小一角,我怀疑 OP 还没有真正考虑过下雨天的场景。
【解决方案2】:

您可能想要这样的东西,未经测试,因为您没有提供任何示例输入或预期输出:

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2012-09-25
    • 2016-02-17
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多