GNU/Linux >> Tutoriales Linux >  >> Ubuntu

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 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

Ubuntu
  1. Introducción a las expresiones regulares

  2. ¿Qué son los separadores de palabras de Readline?

  3. ¿Transferir una lista de valores a un script Bash?

  4. Bash + Verificar nombre por expresión regular?

  5. 6 ejemplos de expresiones condicionales de Bash (-e, -eq, -z, !=, [, [[ ..)

Introducción a las expresiones regulares

Expresión de secuencia Bash (rango)

Expresiones regulares en Grep (Regex)

¿Por qué `\d` no funciona en expresiones regulares en sed?

Problema(s) de expresiones regulares en Bash:[^negate] no parece funcionar

rango de números de extracción de grep