2016-01-27 2 views
1

Я получил следующий текстовый файл, который содержит:Regex в Баш scipt

12.3-456, test 
test test test 

Если строка содержит XX.X-ххх, то я хочу, чтобы напечатать строку. (X являются числа)

Я думаю, что у меня есть правильное регулярное выражение и протестировали его здесь: http://regexr.com/3clu3

я потом использовал это в Баш скрипт, но строка, содержащая текст не печатается. Что я испортил?

#!/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 
+1

Заменить '\ d' с' [0-9] 'и избежать точку. –

+3

И никаких косых черт или 'g'. И избегайте '.'. '[[" $ line "= ~ [0-9] {2} \. [0-9] - [0-9] {3},]]' должен делать. – Biffen

ответ

5

Вы должны использовать [0-9] вместо \d Баш регулярных выражений. Не требуется никаких разделителей регулярных выражений, и глобальный флаг также не нужен. Кроме того, вы можете немного сократить его с помощью limiting quantifiers (например, {3}, который будет соответствовать 3 вхождениям шаблона рядом с ним). Кроме того, точка соответствует любому символу в регулярном выражении, поэтому вам нужно избегать его, если вы хотите совместить символ буквальной точки.

Использование

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

+1 Для размещения регулярного выражения в переменной. Хотя «точка соответствует любому персонажу в Bash», является немного общей, так как это может означать * globs *, например. Я бы заменил «Bash» на «регулярные выражения». –

+0

Да, я имел ввиду модуль регулярного выражения, извините. –

+1

Спасибо - это делает работу. – Greg

1

Это работает:

#!/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 

регулярное выражение - следует ' 'с последующим alphachars [любой из 0-9, '''.']. Это может быть усовершенствовано несколькими способами - например, Явные места до/после '-'.

Тестирование показывает:

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

+1 Для использования * ERE * as '= ~' поддерживает. Я бы удалил фигурные скобки вокруг 'regex' (т.е.' [[$ line = ~ $ regex]] '), поскольку они не требуются в этом контексте (также неправильно в этом примере) и могут путать начинающих, которые часто думают, что они заменить цитаты :-) –

+1

@RanyAlbegWein спасибо за отзыв - исправлено. Скобки как цитаты, правда? Cheers :-) – wmorrison365

+0

Cool :-) Я возвращаю «(также неправильно в этом примере)» - Это не так. Я хотел сказать, что если, по ошибке, будут использоваться двойные кавычки вокруг '$ regex', это будет неправильно. Да, слишком много людей путают фигурные скобки вокруг переменных с двойными кавычками - по какой-то причине они ожидают того же эффекта. Вы должны признать, что они выглядят защищенными от разрыва слов * :-) Приветствия! –

Смежные вопросы