sed buscar y reemplazar palabras completas


120

¿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.

Respuestas:


164

\ 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


@OlegMazko También vine buscando el método posix aceptable para usar en vim y lo que funcionó para mí fue s / \ <7 // g. Estaba tratando de eliminar un 7 al comienzo de una palabra en mi código. Este enlace, específicamente, la solución de JP, me llevó a la respuesta: stackoverflow.com/questions/3864467/… (no pude obtener un descuento para incrustarlo como el suyo por alguna razón).
jimh

Gracias, me estaba volviendo loco tratando de reemplazar la palabra "y", así que \band\bsalvó el día :)
MitchellK

144

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


19
Simplemente instale GNU 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.
Jim Stewart

9
@JimStewart es una excelente manera de romper un montón de herramientas que asumen 'cuando estés en OS X, haz como los OS Xers'. Dicho esto, definitivamente puedo sugerir brew install coreutils, que antepone todas las herramientas GNU.
ELLIOTTCABLE

16
brew install gnu-sedpara usargsed
k107

brew coreutils es impresionante. ¿Hay otros paquetes de preparación que instalen un montón de versiones GNU de comandos o necesito instalar el resto individualmente?
ckot

2
Utilizando Perl es siempre una solución mejor: perl -pe 's|\bone\b|two|g'. Funciona de forma estable mientras sed falla aquí y allá.
Pavel Vlasov

13

Usar \bpara límites de palabras:

sed -i 's/\boldtext\b/newtext/g' <file>

3
Tenga cuidado con []: o,l-> [newtext],[newtext]. Obviamente sed -i 's/\boldtext\b/newtext/g'
quisiste

7

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

2

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

-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment

OP establece explícitamente "usar sed"
ndemou

Se trata de un split-manipulate-join, no un reemplazo puro; esto colapsa múltiples espacios en uno y descarta cualquier espacio inicial / final: por ejemplo, echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -Eda no bar embarassment$.
musiphil
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.