sed
ファイルをスキャンしてパターンを見つけ、一致するパターンの一部をファイル名として使用し、ファイルの内容をその場所に挿入しようとします。ほとんどの作業を実行できますが、ファイル名の代わりに逆参照を使用する方法がわからないようです。
簡単に言えば、ラテックスファイルは前処理され、すべての最上位\input
コマンドは削除されなければなりません。これはlilypond-book
Stupid™だからです。
# Setup files for example
$ echo "foo\n\\input{file2}\nfoo" > file1
$ echo "bar\nbar" > file2
# Use sed to find and replace latex \input commands
$ sed $'/^\\\\input{\\(.*\\)}$/ {r file2\n d}' file1
foo
bar
bar
foo
これまでは問題ありませんでしたが、ハードコードされたファイル名があるため、上記のグループ一致結果({
および}
区切り文字の間の部分)をファイル名として使用する必要があります。残念ながら、これは機能しません。
$ sed $'/^\\\\input{\\(.*\\)}$/ {r \\1\n d}' file1
foo
foo
これらのシナリオで一致するパターンをファイル名として使用するには?
答え1
GNUを使用すると、sed
次のことができます。
sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"
(つまり、cat<'the-file'
コマンドを作成し(必要に応じてファイル名に引用符をエスケープする)、コマンドのe
フラグs
(GNUのみ)を使用してコマンドを評価します。