首页 > 解决方案 > 用名称等于正则表达式捕获组的文件替换字符串

问题描述

我有一个名为的文件foo,我想在其中替换包含以下正则表达式匹配的行:

<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

标签: sed

解决方案


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

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

然后您可以删除该行并sed使用r命令读取文件并使用删除行d

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

您可以使用eGNU 扩展sed并执行脚本而不是部分。

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

您应该强烈考虑使用可识别 XML 的解析器,例如xmlstarletor xmllint,并考虑使用真正的编程语言,至少编写类似pythonor的脚本perl


推荐阅读