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='[0-9]'.

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

К двум регулярным выражениям может присоединиться инфиксный оператор "|"; получающееся регулярное выражение соответствует любому сопоставлению строк любое подвыражение.

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

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

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

1
задан 27 December 2014 в 03:55

2 ответа

Замена расширения параметра не работает с регулярными выражениями. 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
1
ответ дан 11 November 2019 в 02:28

Если Вы просто занимаете место в шаблонах, я предлагаю 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
0
ответ дан 11 November 2019 в 02:28

Другие вопросы по тегам:

Похожие вопросы: