Bash: Регулярные выражения в замене

Bash: Регулярные выражения в замене

У меня есть скрипт bash для подстановки числовых значений внутри текстового шаблона. Предположим, у меня есть такой файл:

word5word
word55word

И я хочу, чтобы это выглядело так:

word125word
word125word

У меня есть этот скрипт, который это делает:

#!/bin/bash

re='([0-9]|[0-9][0-9])'
while read line
  do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
  done < /home/tomak/test.txt

По какой-то причине выражение 're' интерпретируется неправильно и печатает исходные строки. Я просто не могу понять почему. Это работает для одной цифры, т.е. re='[0-9]'.

Для формулировки выражения я использовал информацию изРуководство по Bash для начинающихв котором говорится, что:

Два регулярных выражения можно объединить с помощью инфиксного оператора «|»; полученное регулярное выражение соответствует любой строке, соответствующей любому из подвыражений.

Но у меня это просто не работает. Что я упускаю?

Обратите внимание, что я пытался задать shopt -s extglobи сформулировать выражение следующим образом, [0-9][0-9]?но это тоже не сработало.

У меня Ubuntu 14.10 и стандартная версия bash 4.3.30. Я запускаю скрипт с помощью bash foo.sh.

решение1

Подстановка параметра расширения не работает с регулярными выражениями. extglobможет вам здесь помочь, но она тоже не работает с регулярными выражениями.

Правильный синтаксис для приведенного ниже выражения extglob:

re='+([0-9])'

т.е. цифра один или несколько раз.

Тест:

re='+([0-9])'
echo $'word5word\nword55word' | while read line ; do
    new_line=${line/"word"$re"word"/"word"125"word"}
    echo "$new_line"
done

Выход:

word125word
word125word

решение2

Если вы просто заменяете шаблоны, я предлагаю sed или perl вместо bash:

sed -e 's/word[0-9]\+word/word125word/g' /home/tomak/test.txt

или

perl -pe 's/word\d+word/word125waord/g' /home/tomak/test.txt

Связанный контент