Saltar al contenido

¿Cómo reemplazar los corchetes emparejados con otra sintaxis con sed?

Solución:

Tomó un poco de esfuerzo, pero aquí:

sed -i.bkup  's/[([^]]*)]/\macro{1}/g' test.txt

Veamos si puedo explicar esta expresión regular:

  1. los [ is matching a square bracket. Since [ is a valid magic regular expression character, the backslash means to match the literal character.
  2. The (...) is a capture group. It captures the part of the regular expression I want. I can have many capture groups, and in sed I can reference them as 1, 2, etc.
  3. Inside the capture group (...). I have [^]]*.
    1. los [^...] sintaxis significa cualquier carácter menos.
    2. los [^]] significa cualquier carácter excepto una llave de cierre.
    3. los * significa cero o más de los anteriores. Eso significa que estoy capturando cero o más caracteres que no cierran llaves.
  4. los ] significa el corchete de cierre

Echemos un vistazo a la linea este es [some] más [text]

  • En el n. ° 1 anterior, capturo el primer corchete abierto delante de la palabra algunos. Sin embargo, no está en un grupo de captura. Este es el primer personaje que voy a sustituir.
  • Ahora comienzo un grupo de captura. Estoy capturando de acuerdo con 3.2 y 3.3 arriba, comenzando con la letra s en algunos tantos caracteres como sea posible que no sean corchetes de cierre. Esto significa que estoy emparejando [some, but only capturing some.
  • In #4, I have ended my capture group. I’ve matched for substitution purposes [some and now I’m matching on the last closing square bracket. That means I’m matching [some]. Tenga en cuenta que las expresiones regulares suelen ser codiciosas. Explicaré a continuación por qué esto es importante.
  • Ahora, puedo hacer coincidir la cadena de reemplazo. Esto es mucho más sencillo. Es \macro(1). los 1 es reemplazado por mi grupo de captura. los \ es solo una barra invertida. Por lo tanto, reemplazaré [some] con macro{some}.

Sería mucho más fácil si se me garantizara un solo juego de corchetes en cada línea. Entonces podría haber hecho esto:

sed -i.bkup 's/[(.*)]/\macro(1)/g'

El grupo de captura ahora dice algo entre corchetes. Sin embargo, el problema es que las expresiones regulares son codiciosas, eso significa que habría coincidido desde el s en some todo el camino hasta la final t en el texto. La ‘x’ a continuación muestra el grupo de captura. los [ and ] muestra los corchetes con los que coincido:

 this is [some] more [text]
         [xxxxxxxxxxxxxxxx]

Esto se volvió más complejo porque tuve que hacer coincidir los caracteres que tenían un significado especial con las expresiones regulares, por lo que vemos muchas barras invertidas. Además, tuve que tener en cuenta la codicia de las expresiones regulares, lo que hizo que la cadena de aspecto agradable y no coincidente [^]]* para que coincida con cualquier cosa que no sea un corchete de cierre. Agregue los corchetes antes y después [[^]]*]y no olvides el (...) grupo de captura: [([^]]*)]Y obtienes un gran lío de expresión regular.

sed -e 's/[([^]]*)]/\macro{1}/g' file.txt

Esto busca un paréntesis de apertura, cualquier número de paréntesis que no se cierren explícitamente, luego un paréntesis de cierre. El grupo es capturado por los parens y se inserta en la expresión de reemplazo.

grupos de uso

sed 's|[([^]]*)]|\macro{1}|g' file
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *