将匹配的文件路径替换为 sed 路径中的文件内容

将匹配的文件路径替换为 sed 路径中的文件内容

我想编写一个简短的部署脚本,将 javascript 文件的内容输入到单个 html 文件中。这些js文件当前声明为:

  <script src="js/jquery-1.8.2.js"></script>
  <script src="js/jquery.rotate-2.2.js"></script>
  <script src="js/underscore.js"></script>
  <script src="js/backbone.js"></script>
  <script src="js/backbone.dualstorage.js"></script>
  <script src="js/favourites.js"></script>
  <script src="js/menuItem.js"></script>
  <script src="js/companies.js"></script>
  <script src="js/lectures.js"></script>
  <script src="js/banquette.js"></script>
  <script src="js/menu.js"></script>
  <script src="js/application.js"></script>
  <script src="js/main.js"></script>

我得到了下面的 sed 脚本,它几乎可以满足我的要求:

sed -r -e '/<script src="(.*)">/r \1' -e '/<script src="(.*)">/d' index.html

使用上述输入运行此 sed 命令的结果是空字符串。我不确定 \1 的哪一部分失败了。是因为引用在 s 命令之外不起作用吗?

跑步:

sed -r -e 's/<script src="(.*)">/\1/'

结果是:

js/jquery-1.8.2.js</script>
js/jquery.rotate-2.2.js</script>
js/underscore.js</script>
And so on ...

很明显,正则表达式匹配正确的东西。

有没有办法调试第一个命令中 \1 所包含的内容,以查看路径是否不正确?

答案1

事实并非如此。正如您所说,反向引用在命令之外不起作用s

你可以使用 awk 或 perl 来完成:

perl -pe 's{<script src="(.*?)">}{
  local$/;open F,"<$1";"<script>".<F>}ge'

答案2

GNU sed 的e命令可能是一个解决方案:

sed '
/<script src="/ {
  s/.*<script src="\([^"]\+\)">.*/cat \1/
  e
  }
' index.html

e如果不带参数,将执行模式空间的内容作为命令,因此将匹配的行重写为 shell 命令,就像这样cat js/foobar.js做的技巧一样。命令的输出替换模式空间。

相关内容