Risposte:
\ b nelle espressioni regolari corrisponde ai confini delle parole (cioè la posizione tra il primo carattere della parola e il carattere non della parola):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
salvato la giornata :)
Su Mac OS X, nessuna di queste sintassi regex funziona all'interno di sed per la corrispondenza di parole intere
\bmyWord\b
\<myWord\>
Ascoltami ora e credimi più tardi, questa brutta sintassi è ciò che devi usare:
/[[:<:]]myWord[[:>:]]/
Quindi, ad esempio, per sostituire la menta con menta solo per parole intere:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Fonte: pagina man di re_format
sed
(e ogni altro strumento GNU) tramite MacPorts o Homebrew e assicurati che venga prima nel tuo file PATH
. È possibile rendere un Mac abbastanza utilizzabile.
brew install coreutils
, che fa da prefisso a tutti gli strumenti gnu.
brew install gnu-sed
da usaregsed
perl -pe 's|\bone\b|two|g'
. Funziona stabilmente mentre sed fallisce qua e là.
Utilizzare \b
per i confini delle parole:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Ovviamente intendevi sed -i 's/\boldtext\b/newtext/g'
In una delle mie macchine, delimitare la parola con " \b
" (senza virgolette) non ha funzionato. La soluzione era usare " \<
" per il delimitatore iniziale e " \>
" per il delimitatore finale.
Per spiegare con l'esempio di Joakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
nel comando della shell:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
o:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
ma se sei in vim, puoi usare solo il successivo:
:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
dà no bar embarassment$
.