bash正则表达式在一行中匹配多个

时间:2014-03-12 10:06:57

标签: regex bash sed awk

我试图处理我的文字。 比如我得到了:

  

asdf asdf get.this random random get.that

     

get.it this.no also.this.no

我想要的输出是:

  

get.this get.that

     

get.it

所以regexp应该只捕获这种模式(得到。\ w),但它必须递归地执行它,因为一行中有多个出现,所以sed最简单的方法

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

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

4 个答案:

答案 0 :(得分:1)

grep可能会满足您的需求:

grep -o "get[^ ]*" file

答案 1 :(得分:1)

尝试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

答案 2 :(得分:1)

使用awk:

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

的bash

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"

答案 3 :(得分:0)

这可能适合你(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