【问题标题】:bash regex multiple match in one linebash 正则表达式在一行中多个匹配
【发布时间】:2014-03-12 23:53:13
【问题描述】:

我正在尝试处理我的文本。 例如我得到:

asdf asdf get.this 随机随机get.that

get.it this.no 还有.this.no

我想要的输出是:

get.this get.that

得到它

所以正则表达式应该只捕获这种模式(get.\w),但它必须递归地执行,因为一行中出现多次,所以最简单的方法是使用 sed

sed 's/.*(REGEX).*/\1/' 

不起作用(它只显示第一次出现)。 可能好方法是使用 grep -o,但我有旧版本的 grep 并且 -o 标志不可用。

【问题讨论】:

    标签: regex bash sed awk


    【解决方案1】:

    这个grep 可能会满足你的需要:

    grep -o "get[^ ]*" file
    

    【讨论】:

    • 这是一个很好的解决方案,虽然在同一行上的多个匹配项会在新行上输出。
    【解决方案2】:

    试试 awk:

    awk '{for(i=1;i<=NF;i++){if($i~/get\.\w+/){print $i}}}' file.txt
    

    您可能需要针对特定​​问题调整斜线之间的正则表达式。示例输出:

    $ awk '{for(i=1;i<=NF;i++){if($i~/get\.\w+/){print $i}}}' file.txt
    get.this
    get.that
    get.it
    

    【讨论】:

      【解决方案3】:

      使用 awk:

      awk -v patt="^get" '{
          for (i=1; i<=NF; i++) 
              if ($i ~ patt) 
                  printf "%s%s", $i, OFS; 
          print ""
      }' <<< "$text"
      

      狂欢

      while read -a words; do
          for word in "${words[@]}"; do
              if [[ $word  == get* ]]; then
                  echo -n "$word "
              fi
          done
          echo
      done <<< "$text"
      

      perl

      perl -lane 'print join " ", grep {$_ =~ /^get/} @F' <<< "$text"
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -r '/\bget\.\S+/{s//\n&\n/g;s/[^\n]*\n([^\n]*)\n[^\n]*/\1 /g;s/ $//}' file
        

        或者如果你想要每行一个:

        sed -r '/\n/!s/\bget\.\S+/\n&\n/g;/^get/P;D' file
        

        【讨论】:

          猜你喜欢
          • 2023-03-28
          • 2022-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-26
          • 1970-01-01
          相关资源
          最近更新 更多