如何在 sed 中使用反向引用代替檔案名稱?

如何在 sed 中使用反向引用代替檔案名稱?

我試圖使用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

使用 GNUsed你可以做類似的事情:

sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"

(即建立一個cat<'the-file'命令(如果需要,轉義檔案名稱中的引號)並使用e該命令的標誌s(這是 GNU 特定的)來評估該命令)。

相關內容