sed - 用名称等于正则表达式捕获组的文件替换字符串
问题描述
我有一个名为的文件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
解决方案
首先,获取要打开的文件:
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
您可以使用e
GNU 扩展sed
并执行脚本而不是部分。
sed -E 's|<script.*src="(.*)".*></script>|cat \1|e' test.txt
您应该强烈考虑使用可识别 XML 的解析器,例如xmlstarlet
or xmllint
,并考虑使用真正的编程语言,至少编写类似python
or的脚本perl
。
推荐阅读
- java - 计算一个二次方程 - OOP Java switch case
- sql - 有计数的 SQL UPDATE
- javascript - Javascript中的递归四分位数排序器
- java - 使用 java 上传 csv 文件时,应为 DB 中的每一行添加日期
- jquery - 滚动时单击事件后,活动菜单项不会更改他的类
- r - 将一个数据帧拆分为多个数据帧
- java - RMI 服务器端 java.net.MalformedURLException:未知协议:c
- c# - 使用 Lambda 表达式参数调用通用方法(以及仅在运行时知道的类型)
- regex - 正则表达式以未定义的顺序匹配给定数量的字符
- git - Bitbucket 拉取请求,其中源 repo 是 forkee,目标 repo 是 fork