【问题标题】:Is there a way to put the following logic into a grep command?有没有办法将以下逻辑放入 grep 命令中?
【发布时间】:2011-09-12 01:07:25
【问题描述】:

例如假设我有以下数据

ABC,3,4
,,ExtraInfo
,,MoreInfo
XYZ,6,7
,,XyzInfo
,,MoreXyz
ABC,1,2
,,ABCInfo
,,MoreABC

让 grep 提取 ABC 行很简单。但是,如果我还想获取以下行来生成此输出

ABC,3,4
,,ExtraInfo
,,MoreInfo
ABC,1,2
,,ABCInfo
,,MoreABC

这可以使用 grep 和标准 shell 脚本来完成吗?

编辑:只是为了澄清中间可能有可变数量的行。逻辑是在 CSV 的第一列为空时继续打印。

【问题讨论】:

    标签: linux shell text csv grep


    【解决方案1】:

    grep -A 2 {Your regex} 将输出找到的字符串后面的两行。

    更新: 由于您指定它可以是任意数量的行,因此这是不可能的,因为 grep 专注于匹配单行,请参阅以下问题:

    【讨论】:

      【解决方案2】:

      您可以使用它,尽管由于管道末尾的 grep 会导致任何不以 'A' 或 ',' 开头的内容静音,这有点麻烦:

      $ sed -n '/^ABC/,/^[^,]/p' yourfile.txt| grep -v '^[^A,]'
      

      编辑:一种不那么骇人听闻的方法是使用 awk:

      $ awk '/^ABC/ { want = 1 } !/^ABC/ && !/^,/ { want = 0 } { if (want) print }' f.txt
      

      如果你大声读出大括号中的模式和东西,你就可以理解它的作用。

      【讨论】:

      • 甚至更少的hackity awk:awk -F, '$1 != "" {want = $1 == "ABC"} want {print}'
      【解决方案3】:

      manpage 有选项的解释,你想看看Context Line Control下的-A。

      【讨论】:

        猜你喜欢
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2021-02-04
        • 2021-09-09
        • 1970-01-01
        • 2023-01-26
        • 2023-01-03
        相关资源
        最近更新 更多