
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 extglob
y 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. extglob
Puede ayudarte aquí, pero tampoco funciona con expresiones regulares.
La sintaxis correcta para la expresión siguiente 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
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