В настоящее время у меня есть набор пакетов LaTeX по умолчанию, которые я часто использую, отформатированный следующим образом:
package1
[options]package2
[options]package3
package4
...
Я хотел бы иметь возможность преобразовать это в стандартную нотацию LaTeX \usepackage[options]{package} или \usepackage{package} в зависимости от того, есть ли у пакета дополнительные опции. Я успешно создал команду sed/regex для преобразования строк с опциями, но она пропускает пакеты без опций.
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
Если запустить этот код на строке, содержащей только пакет, он даст сбой (как я и ожидал).
echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package
Является ли это проблемой регулярных выражений, и если да, то как мне к ней подойти?
решение1
Проверьте, подходит ли вам этот вариант:
$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}
Я заменил .*
на , ^
чтобы соответствовать началу строки, и добавил , \?
чтобы сделать скобки необязательными.
решение2
Этот двухэтапный подход кажется более простым:
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- Первый шаг,
s/[^]]*$/{&}/
, помещает имя проекта в фигурные скобки, сопоставляя максимально длинную строку символов, отличных от]
, до конца строки. - Второй шаг,
s/^/\\usepackage/
просто добавляется\usepackage
к началу строки.