es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cómo reemplazar con expresiones regulares antes de dos puntos?

Este es mi texto original:

NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1

Quiero agregar una barra invertida solo antes de todos los espacios antes de :. Entonces, esto es lo que finalmente quiero:

NetworkManager/system\ connections/Wired\ 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1

Necesito hacer esto en bash, por lo que sed, awk y grep están bien para mí.

He intentado el siguiente sed, pero ninguno de ellos funciona:

echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/ .*\(:.*$\)/\\ .*\1/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/\( \).*\(:.*$\)/\\ \1.*\2/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/ .*\(:.*$\)/\\ \1/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/\( \).*\(:.*$\)/\\ \1\2/g'

Gracias por responder mi pregunta. Soy bastante nuevo en Stack Overflow, no sé cómo controlar el formato en los comentarios. Así que solo edito mi pregunta original.

Mi verdadera historia es:
Cuando uso grep o uso cscope para buscar una palabra clave, por ejemplo, “address1” en la carpeta /etc, el resultado sería así:

./NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1

Si uso vim para abrir el archivo debajo del cursor, supongamos que mi cursor de vim está ahora en la palabra “NetworkManager”, entonces vim lo entenderá como:

"./NetworkManager/system"

Por eso quiero agregar “\” antes del espacio, para que el resultado de la búsqueda sea más amigable con vim 🙂

Intenté cambiar el código fuente de cscope, pero es muy difícil lograrlo por completo. Así que tengo que hacer una sustitución posterior 🙁

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar una barra invertida antes de los espacios antes de “:” en tu cadena original, puedes usar el siguiente comando sed en bash:

    echo "NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1" | sed 's/ \([^:]*:\)/\\\1/g'
    

    El resultado será:

    NetworkManager/system\ connections/Wired\ 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1
    

    Explicación del comando sed:

    • s/: comando de sustitución para buscar y reemplazar
    • : espacio antes de \( para encontrar el espacio antes de : en la cadena
    • \([^:]*:\): grupo de caracteres antes de : que no contiene :
    • /: delimitador antes de la cadena de reemplazo
    • \\: barra invertida para agregar antes del espacio
    • \1: referencia hacia atrás al primer grupo de caracteres capturados en el patrón de búsqueda
    • /g: indicador global para reemplazar todas las ocurrencias del patrón en la cadena

Comments are closed.