Atualmente tenho um conjunto de pacotes LaTeX padrão que uso frequentemente formatados da seguinte forma:
package1
[options]package2
[options]package3
package4
...
Eu gostaria de poder converter isso para a notação LaTeX padrão de \usepackage[options]{package} ou \usepackage{package} dependendo se o pacote possui opções adicionais. Criei com sucesso um comando sed/regex para converter as linhas com opções, mas faltam os pacotes sem opções.
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
Quando isso é executado em uma linha com apenas um pacote, ele falha (como seria de esperar).
echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package
Este é um problema de regex e, em caso afirmativo, como devo abordá-lo?
Responder1
Verifique se isso funciona para você:
$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}
Substituí .*
por ^
para corresponder ao início da linha e adicionei \?
para tornar os colchetes opcionais.
Responder2
Esta abordagem em duas etapas parece ser mais simples:
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- A primeira etapa
s/[^]]*$/{&}/
, coloca o nome do projeto entre chaves, combinando a sequência de caracteres mais longa possível]
, exceto , até o final da linha. - A segunda etapa,
s/^/\\usepackage/
, simplesmente precede\usepackage
o início da linha.