¿Cómo busco y reemplazo palabras completas usando sed?
Haciendo
sed -i 's/[oldtext]/[newtext]/g' <file>
también reemplazará las coincidencias parciales [oldtext]
que no quiero que haga.
\ 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
fuente
sed
(y todas las demás herramientas GNU) a través de MacPorts o Homebrew y asegúrese de que sea lo primero en suPATH
. 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:fuente
[]
:o,l
->[newtext],[newtext]
. Obviamentesed -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 :
fuente
en el comando de shell:
o:
pero si está en vim, solo puede usar la última:
fuente
fuente
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
dano bar embarassment$
.