ciapi
ciapi

Reputation: 51

bash regex multiple match in one line

I'm trying to process my text. For example i got:

asdf asdf get.this random random get.that

get.it this.no also.this.no

My desired output is:

get.this get.that

get.it

So regexp should catch only this pattern (get.\w), but it has to do it recursively because of multiple occurences in one line, so easiest way with sed

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

does not work (it shows only first occurence). Probably the good way is to use grep -o, but i have old version of grep and -o flag is not available.

Upvotes: 2

Views: 4960

Answers (4)

potong
potong

Reputation: 58381

This might work for you (GNU sed):

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

or if you want one per line:

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

Upvotes: 0

glenn jackman
glenn jackman

Reputation: 246774

With 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"

Upvotes: 1

Josh Jolly
Josh Jolly

Reputation: 11786

Try awk:

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

You might need to tweak the regex between the slashes for your specific issue. Sample output:

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

Upvotes: 1

Jotne
Jotne

Reputation: 41456

This grep may give what you need:

grep -o "get[^ ]*" file

Upvotes: 2

Related Questions