Greg
Greg

Reputation: 1813

Regex in a bash scipt

I've got the following text file which contains:

 12.3-456, test
 test test test

If the line contains xx.x-xxx, then I want to print the line out. (X's are numbers)

I think I have the correct regex and have tested it here: http://regexr.com/3clu3

I have then used this in a bash script but the line containing the text is not printed out. What have I messed up?

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    if  [[ $line =~ /\d\d.\d-\d\d\d,/g ]]; then
            echo $line
    fi
done < input.txt

Upvotes: 1

Views: 75

Answers (2)

wmorrison365
wmorrison365

Reputation: 6318

This works:

#!/bin/bash
#regex="/\d\d.\d-\d\d\d,/g"
regex="[0-9\.\-]+\, [A-Za-z]+"

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo $line
    if  [[ $line =~ $regex ]]; then
        echo "match"
    fi
done

regex is [any of 0-9, '.', '-'] followed by ',' followed by alphachars. This could be refined in a number of ways - e.g. explicit places before/ after '-'.

Testing indicates:

$ ./sqltrace2.sh < input.txt 
12.3-456, test
match
123.3-456, test
match
12.3-456,
test test test
test test test

Upvotes: 1

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 627380

You need to use [0-9] instead of a \d in Bash regex. No regex delimiters are necessary, and the global flag is not necessary either. Also, you can contract it a bit using limiting quantifiers (like {3} that will match 3 occurrences of the pattern next to it). Besides, a dot matches any character in regex, so you need to escape it if you want to match a literal dot symbol.

Use

regex="[0-9]{2}\.[0-9]-[0-9]{3},"
if  [[ $line =~ $regex ]]
...

Upvotes: 5

Related Questions