
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 extglob
e 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. extglob
pode 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