Bash: Expressões regulares em substituição

Bash: Expressões regulares em substituição

Eu tenho um script bash para substituir valores numéricos dentro de um padrão de texto. Suponha que eu tenha um arquivo como este:

word5word
word55word

E eu quero que fique assim:

word125word
word125word

Eu tenho esse script para fazer isso:

#!/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

Por alguma razão, a expressão 're' não é interpretada corretamente e imprime as linhas originais. Eu simplesmente não consigo entender o porquê. Funciona para um único dígito, ou seja re='[0-9]'.

Para formular a expressão, utilizei informações doGuia Bash para iniciantesQue afirma que:

Duas expressões regulares podem ser unidas pelo operador infixo "|"; a expressão regular resultante corresponde a qualquer string que corresponda a qualquer subexpressão.

Mas isso simplesmente não funciona para mim. o que estou perdendo?

Observe que tentei definir shopt -s extglobe formular a expressão como, [0-9][0-9]?mas também não funcionou.

Estou no Ubuntu 14.10 e tenho o stock bash versão 4.3.30. Eu executo o script com bash foo.sh.

Responder1

A substituição da expansão de parâmetros não funciona com expressões regulares. extglobpode ajudá-lo aqui, mas também não funciona com expressões regulares.

A sintaxe correta para a expressão abaixo extglobé

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

ou seja, um dígito uma ou mais vezes.

Teste:

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

Saída:

word125word
word125word

Responder2

Se você está apenas substituindo padrões, sugiro sed ou perl em vez de bash:

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

ou

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

informação relacionada