Bash: expressões regulares em substituição

1

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 seja assim:

word125word
word125word

Eu tenho este 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 algum motivo, a expressão 're' não é interpretada corretamente e imprime as linhas originais. Eu simplesmente não consigo descobrir o porquê. Ele funciona para um dígito único, ou seja, re='[0-9]' .

Para formular a expressão, usei informações do Guia do Bash para iniciantes que afirma que:

  

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

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

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

Estou no Ubuntu 14.10 e tenho a versão de ações 4.3.30. Eu corro o script com bash foo.sh .

    
por tomak 27.12.2014 / 11:55

2 respostas

2

A substituição da expansão de parâmetro não funciona com expressões regulares. extglob pode ajudar você aqui, mas também não funciona com expressões regulares.

A sintaxe correta para a expressão em extglob é

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

i.e. 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
    
por choroba 27.12.2014 / 12:28
0

Se você está apenas substituindo em padrões, sugiro sed ou perl ao invés 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
    
por JJoao 28.12.2014 / 17:01