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.

ksuralta
fuente

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
Joakim Lundborg
fuente
9
no posix | GNU sed OK
Oleg Mazko
@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

Larry Gerndt
fuente
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>
Trigo Mitch
fuente
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
Arun
fuente
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
Arganzheng
fuente
-1
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
ghostdog74
fuente
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