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 de la Guía Bash para principiantes que establece que:
Dos expresiones regulares pueden estar unidas por el operador infijo “|”; 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 traté de configurar shopt -s extglob
y formular la expresión como [0-9][0-9]?
pero eso tampoco funcionó.
Estoy en Ubuntu 14.10 y tengo la versión stock bash 4.3.30. Ejecuto el script con bash foo.sh
.
Respuesta aceptada:
La sustitución de la expansión de parámetros no funciona con expresiones regulares. extglob
puede ayudarte aquí, pero tampoco funciona con expresiones regulares.
La sintaxis correcta para la expresión bajo extglob
es
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
Salida:
word125word
word125word