如何在 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 特定的)来评估该命令)。

相关内容