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\bsalvato 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-sedda usaregsed
perl -pe 's|\bone\b|two|g'. Funziona stabilmente mentre sed fallisce qua e là.
Utilizzare \bper 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 -Edà no bar embarassment$.