Respuestas:
\ b en las expresiones regulares coincide con los límites de las palabras (es decir, la ubicación entre el carácter de la primera palabra y el carácter que no es una palabra):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
salvó el día :)
En Mac OS X, ninguna de estas sintaxis de expresiones regulares funciona dentro de sed para hacer coincidir palabras completas
\bmyWord\b
\<myWord\>
Escúchame ahora y créeme más tarde, esta fea sintaxis es lo que necesitas usar:
/[[:<:]]myWord[[:>:]]/
Entonces, por ejemplo, para reemplazar menta con menta solo para palabras completas:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Fuente: página de manual de re_format
sed
(y todas las demás herramientas GNU) a través de MacPorts o Homebrew y asegúrese de que sea lo primero en su PATH
. Es posible hacer que una Mac sea bastante utilizable.
brew install coreutils
, que antepone todas las herramientas GNU.
brew install gnu-sed
para usargsed
perl -pe 's|\bone\b|two|g'
. Funciona de forma estable mientras sed falla aquí y allá.
Usar \b
para límites de palabras:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Obviamente sed -i 's/\boldtext\b/newtext/g'
En una de mis máquinas, delimitar la palabra con " \b
" (sin las comillas) no funcionó. La solución fue utilizar " \<
" para el delimitador inicial y " \>
" para el delimitador final.
Para explicar con el ejemplo de Joakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
en el comando de shell:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
o:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
pero si está en vim, solo puede usar la última:
:% 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
da no bar embarassment$
.