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