【问题标题】:How to find string before and after specified word using Grep and RegEx如何使用 Grep 和 RegEx 在指定单词之前和之后查找字符串
【发布时间】:2015-01-29 14:06:51
【问题描述】:

例如,我有一个包含 ff 组字符串的文件

AAA1111BBB -> FILE1
AAA2222BBB -> FILE2
AAA3333BBB -> FILE3

现在在 unix 中,我想通过搜索 AAA 作为行的开头和 BBB 作为模式的结尾的模式来提取所有 ID。输出会是这样的

1111
2222
3333

然后我想删除所有重复的条目,然后将其保存在一个文件中。我将如何做到这一点?

【问题讨论】:

    标签: regex bash shell unix


    【解决方案1】:

    如果你有grep -P 选项可用,你可以试试

    (?<=A{3})\d+(?=B{3})
    

    此正则表达式使用环视查找被AAABBB 包围的数字

    【讨论】:

    • 如果我有一个包含 AAAZ1@6BBB 的示例文件怎么办?
    • 然后把\d+改成.+?
    • 另外,使用grep -o -P pattern 仅发出匹配项
    • @PeterS 使用.*? 代替\d+
    【解决方案2】:

    嗯,你的小例子可以用这个命令来完成:

    sed -e 's/^AAA//' -e 's/BBB.*//' input.txt | sort -u > output.txt
    

    但是,我的猜测是,您的玩具示例可能不足以准确地解释您要完成的工作......

    【讨论】:

      【解决方案3】:

      使用 GNU awk:

      gawk '
          match($1, /^AAA(.*)BBB$/, m) {keys[m[1]]=1}
          END {for (k in keys) print k}
      ' file
      

      或perl

      perl -nE '/^AAA(\w+)BBB/ and $k{$1}=1 }END{ say join "\n", keys %k' file
      

      【讨论】:

        【解决方案4】:

        我假设您的 ID 是 4 位数字:

        grep -oE "AAA[0-9]{4}BBB" <filename> | grep -oE "[0-9]{4}"
        

        编辑:

        如果你有类似“AAA12@3BBB”的东西:

         grep -oE "AAA.{4}BBB" <filename> | grep -oE "[0-9,@]{4}"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 2012-02-10
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多