sedでファイル名の代わりに逆参照を使用する方法は?

sedでファイル名の代わりに逆参照を使用する方法は?

sedファイルをスキャンしてパターンを見つけ、一致するパターンの一部をファイル名として使用し、ファイルの内容をその場所に挿入しようとします。ほとんどの作業を実行できますが、ファイル名の代わりに逆参照を使用する方法がわからないようです。

簡単に言えば、ラテックスファイルは前処理され、すべての最上位\inputコマンドは削除されなければなりません。これはlilypond-bookStupid™だからです。

# 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のみ)を使用してコマンドを評価します。

関連情報