![Utilice sed para encontrar la palabra completa y reemplazarla](https://rvso.com/image/31683/Utilice%20sed%20para%20encontrar%20la%20palabra%20completa%20y%20reemplazarla.png)
Tengo el siguiente bloque de texto en un archivo:
test3.legacy test4.legacy test3 test3.kami
Sólo quiero buscarlo test3
en su totalidad y reemplazarlo por nada. Desafortunadamente, todos mis intentos han eliminadoprueba3desde test3.legacy
y 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, \s
dado 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
test3
especialmente el principio y el final, - reemplazar
test3
espacios encerrados en un solo espacio, - repetir el proceso mientras haya sustituciones (para cubrir los
test3 test3
casos). - 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