GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Bash:espressioni regolari in sostituzione?

Ho uno script bash per sostituire i valori numerici all'interno di un modello di testo. Supponiamo di avere un file come questo:

word5word
word55word

E voglio che assomigli a questo:

word125word
word125word

Ho questo script per farlo:

#!/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

Per qualche ragione, l'espressione "re" non viene interpretata correttamente e stampa le righe originali. Non riesco proprio a capire perché. Funziona con una sola cifra, ad es. re='[0-9]' .

Per formulare l'espressione, ho utilizzato le informazioni della Bash Guide for Beginners che afferma che:

Due espressioni regolari possono essere unite dall'operatore infix “|”; l'
espressione regolare risultante corrisponde a qualsiasi stringa che corrisponde a una delle
sottoespressione.

Ma semplicemente non funziona per me. Cosa mi sto perdendo?

Nota che ho provato a impostare shopt -s extglob e formulare l'espressione come [0-9][0-9]? ma neanche quello ha funzionato.

Sono su Ubuntu 14.10 e ho la versione stock bash 4.3.30. Eseguo lo script con bash foo.sh .

Risposta accettata:

La sostituzione dell'espansione dei parametri non funziona con le espressioni regolari. extglob può aiutarti qui, ma non funziona nemmeno con le espressioni regolari.

La sintassi corretta per l'espressione in extglob è

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

cioè una cifra una o più volte.

Prova:

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

Uscita:

word125word
word125word

Ubuntu
  1. Espressioni regolari:mettere tutto insieme

  2. Citando entro $(sostituzione comando) in Bash?

  3. Quali sono i separatori di parole Readline?

  4. Convogliare un elenco di valori in uno script Bash?

  5. Bash + Verifica nome tramite espressione regolare?

Iniziare con le espressioni regolari

Espressione sequenza Bash (intervallo)

Espressioni regolari in Grep (Regex)

Perché "\d" non funziona nelle espressioni regolari in sed?

Linux GUI Regular Expression File Renamer (con sostituzione)

grep estrarre l'intervallo di numeri