我有一个名为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的解析器,如xmlstarlet
或xmllint
,并考虑使用真正的编程语言,至少编写像python
或perl
这样的脚本。