У меня есть сценарий удара для замены числовыми значениями в текстовом шаблоне. Предположим, что у меня есть файл как это:
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='[0-9]'
.
Для формулировки выражения я использовал информацию от Руководства Bash для Новичков, которое заявляет что:
К двум регулярным выражениям может присоединиться инфиксный оператор "|"; получающееся регулярное выражение соответствует любому сопоставлению строк любое подвыражение.
Но это просто не работает на меня. Что я пропускаю?
Обратите внимание, что я пытался установить shopt -s extglob
и сформулируйте выражение как [0-9][0-9]?
но это не работало также.
Я нахожусь на Ubuntu 14.10 и имею версию 4.3.30 удара запаса. Я запускаю скрипт с bash foo.sh
.
Замена расширения параметра не работает с регулярными выражениями. extglob
может помочь Вам здесь, но это не работает с регулярными выражениями, также.
правильный синтаксис для выражения под extglob
re='+([0-9])'
т.е. цифра один или несколько раз.
Тест:
re='+([0-9])'
echo Вывод:
word125word
word125word
word5word\nword55word' | while read line ; do
new_line=${line/"word"$re"word"/"word"125"word"}
echo "$new_line"
done
Вывод:
word125word
word125word
Если Вы просто занимаете место в шаблонах, я предлагаю sed или жемчуг вместо удара:
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