【问题标题】:Replace with sed content between a word and last word before a dot [duplicate]用点之前的单词和最后一个单词之间的sed内容替换[重复]
【发布时间】:2020-04-07 01:07:51
【问题描述】:

我可以拥有这种类型的html

<script type="text/javascript" charset="utf-8" src="/javascripts/docs/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
<link rel="stylesheet" href="css/style.css" type="text/css" />
<link rel="stylesheet" href="../common.css" type="text/css" />

我想替换src="href="X.jsX.css 之间的路径。我在https://regex101.com/r/45ekfL/3 上有一个工作版本,但为什么它不能与 sed 一起工作?

我想要的结果:

<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../doc/new/test/jquery.js"></script>
<link rel="stylesheet" href="../doc/new/test/style.css" type="text/css" />
<link rel="stylesheet" href="../doc/new/test/common.css" type="text/css" />

我最接近的 javascript 链接是:

echo '<script type="text/javascript" charset="utf-8" src="js/app.js"></script>' | \
    sed -E 's#(src=").*(\w*.js)#\1/new/path/\2#'

带有# 标志,因为我为我的新路径注入了斜线。

它给了我:

<script type="text/javascript" charset="utf-8" src="/new/path/.js"></script>

如果我在最后一个捕获组 (src=").*\/(\w*.js) 之前添加缺少的斜杠,我的 sed 将不再工作。

为什么? 我可以使用命名捕获组吗?是个好主意吗?

我在 osx 上,但该命令也将在 ubuntu 机器上使用。

【问题讨论】:

  • 问题是.*是贪心的,所以它尽可能匹配,然后\w*什么都不匹配。
  • Sed 不支持命名捕获组,它只支持 BRE 和 ERE。
  • 它似乎与(src=").*\/(\w*.js) 一起工作正常,请参阅demo。请注意,您需要在 js 之前转义点。
  • @WiktorStribiżew 它在 osx 上不起作用。我对正则表达式的 sed 处理可能不同。 ://
  • 我不知道 osx 但由于 \w 是非标准的,你检查过你的 sed 支持它吗?无论如何\w* 与文件名不匹配,例如app.min.jsapp-v2.js 将失败。你可以试试这个:s#(src=")[^"]*(/[^"]*\.js")#\1/new/path\2#。另请注意,使用正则表达式解析 html 通常被认为是一种不好的做法,因为这种语言可能过于复杂,因此您应该只使用具有已知结构的简单 html 片段来执行此操作。

标签: regex sed


【解决方案1】:

如评论中所述

我不知道 osx 但因为 \w 是非标准的

所以这里有两个建议

sed -E 's#(src=")[^"]*(/[^"]*\.js")#\1/new/path\2#'

sed -E 's#(src=").*\/([a-z]*.js)#\1/new/path/\2#'

但不建议保留我的处理html:

使用正则表达式解析 html 通常被认为是一种不好的做法,因为这种语言可能过于复杂

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2020-10-24
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多