
У меня есть скрипт 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