現在、私が頻繁に使用するデフォルトの 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}
これをパッケージのみの行で実行すると、失敗します (予想どおり)。
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
行の先頭に追加されます。