Actualmente tengo un conjunto de paquetes LaTeX predeterminados que uso con frecuencia formateados de la siguiente manera:
package1
[options]package2
[options]package3
package4
...
Me gustaría poder convertir esto a la notación LaTeX estándar de \usepackage[options]{package} o \usepackage{package} dependiendo de si el paquete tiene opciones adicionales. Creé con éxito un comando sed/regex para convertir las líneas con opciones, pero omite los paquetes sin opciones.
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
Cuando esto se ejecuta en una línea con solo un paquete, falla (como era de esperar).
echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package
¿Es esto un problema de expresiones regulares y, de ser así, cómo debo abordarlo?
Respuesta1
Por favor verifique si esto funciona para usted:
$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}
Reemplacé .*
con ^
para que coincidiera con el inicio de la línea y agregué \?
para que los corchetes sean opcionales.
Respuesta2
Este enfoque de dos pasos parece ser más simple:
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- El primer paso,
s/[^]]*$/{&}/
coloca el nombre del proyecto entre llaves haciendo coincidir la cadena de caracteres más larga posible distinta de]
, hasta el final de la línea. - El segundo paso,
s/^/\\usepackage/
simplemente se antepone\usepackage
al principio de la línea.