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:
- los
[
is matching a square bracket. Since[
is a valid magic regular expression character, the backslash means to match the literal character. - The
(...)
is a capture group. It captures the part of the regular expression I want. I can have many capture groups, and insed
I can reference them as1
,2
, etc. - Inside the capture group
(...)
. I have[^]]*
.- los
[^...]
sintaxis significa cualquier carácter menos. - los
[^]]
significa cualquier carácter excepto una llave de cierre. - los
*
significa cero o más de los anteriores. Eso significa que estoy capturando cero o más caracteres que no cierran llaves.
- los
- 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 capturingsome
. - 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)
. los1
es reemplazado por mi grupo de captura. los\
es solo una barra invertida. Por lo tanto, reemplazaré[some]
conmacro{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