sed でファイル名の代わりにバック参照を使用するにはどうすればよいですか?

sed でファイル名の代わりにバック参照を使用するにはどうすればよいですか?

ファイルをスキャンしてパターンを見つけ、一致したパターンの一部をファイル名として使用し、その場所にファイルの内容を挿入しようとしていますsed。大部分はうまく機能していますが、ファイル名の代わりにバック参照を使用する方法がわかりません。

\input簡単に言うと、LaTeX ファイルを前処理してトップレベルのコマンドをすべて削除する必要があるというのは、lilypond-book愚かなことです。

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

関連情報