用文件名等于regex捕获组的文件替换字符串



我有一个名为foo的文件,我想替换包含以下regex匹配的行:

<script.*src="(.*)".*></script>

使用文件名等于上面正则表达式中第一个捕获组的文件的内容。例如,我可能在foo中有以下行:

<script type="text/javascript" src="bar.js"></script>

我想用bar.js文件中的内容替换。

我想以某种方式打开第一个捕获组引用的文件。这是我目前所看到的:

sed -r "s/<script.*src="(.*)".*></script>/$(cat 1) /" foo

但我得到了cat: 1: No such file or directory

甚至当我尝试手动指定我想要打开的文件时,我得到一个我无法理解的错误:

sed -r "s/<script.*src="(.*)".*></script>/$(cat bar.js)/" test.txt

错误:

sed: -e expression #1, char 53: unterminated `s' command

首先,获取要打开的文件:

file=$(sed -En 's|.*<script.*src="(.*)".*></script>.*|1|p' test.txt)

则可以使用r命令删除sed中的行并读取文件,使用d命令删除行。

sed -E -e '|.*<script.*src="(.*)".*></script>.*|{ r '"$file" -e 'd;}' test.txt

您可以使用e扩展到GNUsed并执行脚本而不是部分。

sed -E 's|<script.*src="(.*)".*></script>|cat 1|e' test.txt

您应该强烈考虑使用可识别XML的解析器,如xmlstarletxmllint,并考虑使用真正的编程语言,至少编写像pythonperl这样的脚本。

最新更新