Вопрос 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.3. Я запускаю сценарий с помощью bash foo.sh,


1
2017-12-27 10:55


происхождения




ответы:


Подстановка параметров не работает с регулярными выражениями. 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
2017-12-27 11:28





Если вы просто подменяете шаблоны, я предлагаю 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

0
2017-12-28 16:01