Esistono molte variazioni sulla sintassi delle espressioni regolari . I primissimi strumenti nel mondo unix che avevano espressioni regolari non avevano le piene capacità di espressioni regolari, solo set di caratteri ( […]
e .
), ripetizione ( *
) e ancore di linea ( ^
e $
). Le espressioni regolari di base hanno solo questi operatori. Sed è uno strumento di vecchia scuola e utilizza regexps di base.
Molte implementazioni di sed hanno estensioni per la corrispondenza completa di regexp. Poiché il personaggio |
rappresenta se stesso, devi usarlo \|
per l'alternanza e in modo simile \(
e \)
per il raggruppamento. Si noti che lo standard POSIX non \|
richiede il supporto supportato nelle espressioni regolari di base e alcuni sistemi (ad esempio OpenBSD ) non lo hanno.
Alcune versioni di sed hanno un'opzione per passare a espressioni regolari estese , dove (…)
viene utilizzato per il raggruppamento e |
per l'alternanza. Con GNU sed (cioè sotto Linux o Cygwin) o Busybox , passa l' -r
opzione. Su FreeBSD o OSX , passa l' -E
opzione.
Se il tuo sed non ha alternanza, puoi chiamare awk
invece. È obbligatorio per POSIX , ma un po 'dettagliato per questa attività e non supporta i riferimenti indietro.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
A proposito, solo GNU e Busybox possono supportare la sostituzione dei file in atto. Awk e altre versioni di sed no. Vedi Posso fare in modo che `cut` cambi un file sul posto?
Se hai Perl, è spesso utile in un unico modo per elaborare testi con una sola riga. Gran parte di ciò che è facile in sed, awk e il resto non è molto più difficile in Perl, e puoi cavartela imparando un singolo (se complesso) strumento.
perl -i -pe 's/foo|bar/narf/g' fileName