Utilice sed para encontrar la palabra completa y reemplazarla

Utilice sed para encontrar la palabra completa y reemplazarla

Tengo el siguiente bloque de texto en un archivo:

test3.legacy test4.legacy test3 test3.kami

Sólo quiero buscarlo test3en su totalidad y reemplazarlo por nada. Desafortunadamente, todos mis intentos han eliminadoprueba3desde test3.legacyy test3.kami. He intentado:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

sin suerte. ¿Alguna idea de cómo puedo resolver esto, por favor?

EDITAR:La mayoría de los intentos han dado como resultado lo siguiente:.legacy test4.legacy .kami

Respuesta1

¿Es esto lo que quieres?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

esto dice

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

Actualizar:

Y como tan elegantemente lo expresa el bueno@Stéphane Chazelasesto no se ocuparía de ciertos casos. También haga hincapié en la parte de la portabilidad. VerResponda abajo.

Una variante de GNU podría,(con un poco de suerte), ser:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

cuidando los partidos repetitivos. Opcionalmente, uno también se ocuparía de múltiples espacios, etc. Dependiendo de la entrada.

EOUPD


Como alternativa tal vez (sólo pretende ser un punto de partida):

sed 's/\Wtest3\W/ /g'

No es esto, supongo:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

Respuesta2

Buscaría test3 envuelto con un espacio a cada lado, \sdado su ejemplo, en lugar de intentar usar la notación de límites de palabras.

Por ejemplo

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

Lo anterior buscaespacioprueba3espacioy reemplaza esto con solo unespacio.

NOTA:¡Esto no solucionará la situación en la que test3 ocupa el primer lugar en la lista!

Respuesta3

Portátilmente:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

Eso es:

  • Primero agregue un espacio al principio y al final de la línea, para no tener que considerar test3especialmente el principio y el final,
  • reemplazar test3espacios encerrados en un solo espacio,
  • repetir el proceso mientras haya sustituciones (para cubrir los test3 test3casos).
  • Elimine el espacio inicial y final que agregamos inicialmente.

Respuesta4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

Por favor intenta arriba

información relacionada