現在よく使用されているデフォルトのLaTeXパッケージセットは、次の形式になっています。
package1
[options]package2
[options]package3
package4
...
パッケージに追加のオプションがあるかどうかに応じて、これを \usepackage[options]{package} または \usepackage{package} の標準 LaTeX 表記法に変換できるようにしたいです。オプションの行を変換するためにsed / regexコマンドを正常に作成しましたが、オプションのないパッケージがありません。
echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}
パッケージが1つしかない行で実行すると、期待どおりに失敗します。
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
この2段階のアプローチはより簡単に見えます。
$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
- 最初のステップは、行の最後までを
s/[^]]*$/{&}/
除いて、可能な限り長い文字列を一致させて]
プロジェクト名を中かっこ内に入れることです。 - 2番目のステップでは、行の先頭に
s/^/\\usepackage/
追加するだけです。\usepackage