Bash: Expresiones regulares en sustitución

Bash: Expresiones regulares en sustitución

Tengo un script bash para sustituir valores numéricos dentro de un patrón de texto. Supongamos que tengo un archivo como este:

word5word
word55word

Y quiero que se vea así:

word125word
word125word

Tengo este script para hacer eso:

#!/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 alguna razón, la expresión 're' no se interpreta correctamente e imprime las líneas originales. Simplemente no puedo entender por qué. Funciona para un solo dígito, es decir re='[0-9]'.

Para formular la expresión, utilicé información delGuía de Bash para principiantesel cual establece que:

El operador infijo "|" puede unir dos expresiones regulares; la expresión regular resultante coincide con cualquier cadena que coincida con cualquiera de las subexpresiones.

Pero simplemente no funciona para mí. ¿Qué me estoy perdiendo?

Tenga en cuenta que intenté establecer shopt -s extgloby formular la expresión como [0-9][0-9]?pero tampoco funcionó.

Estoy en Ubuntu 14.10 y tengo la versión stock bash 4.3.30. Ejecuto el script con bash foo.sh.

Respuesta1

La sustitución de la expansión de parámetros no funciona con expresiones regulares. extglobPuede ayudarte aquí, pero tampoco funciona con expresiones regulares.

La sintaxis correcta para la expresión siguiente extglobes

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

es decir, un dígito una o más veces.

Prueba:

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

Producción:

word125word
word125word

Respuesta2

Si solo estás sustituyendo patrones, te sugiero sed o perl en lugar de bash:

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

o

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

información relacionada