【问题标题】:Removing .html URLs with GREP & XARGS使用 GREP 和 XARGS 删除 .html URL
【发布时间】:2021-07-25 14:27:57
【问题描述】:

我正在使用 WGET 刻录 PHP 网站的静态副本。我想在每个文件的每个<a href 中删除对 .html 的所有引用。所以任何链接,例如<a href="path/project-name.html">Project Name</a>,我想改为<a href="path/project-name">Project Name</a>

grep -rl index.html . | xargs sed -i 's/index.html//g' 命令非常适合删除所有链接中的每个 index.html

但我无法使用命令grep -rl *.html . | xargs sed -i 's/*.html//g' 为每个.html 链接工作。

对我的正则表达式的任何帮助将不胜感激。

【问题讨论】:

  • 's/*.html//g' 是错误的,因为您在 LHS 中输入了一个全局模式,其中需要一个正则表达式模式。你要匹配的模式是什么?
  • 谢谢,@wiktor。所以任何链接,例如<a href="path/project-name.html">Project Name</a>,我想改为<a href="path/project-name">Project Name</a>
  • 试试grep -rl *.html . | xargs sed -i -E 's/(href="[^"]*)\.html"/\1"/g'

标签: regex command-line grep wget xargs


【解决方案1】:

's/*.html//g' 是错误的,因为您在 LHS 中输入了一个全局模式(sed 替换命令的左侧部分),其中需要一个正则表达式模式。

你可以使用

grep -rl *.html . | xargs sed -i -E 's/(href="[^"]*)\.html"/\1"/g'

详情

  • -E - 启用 POSIX ERE 正则表达式语法的选项
  • (href="[^"]*)\.html" - 匹配并捕获到第 1 组(稍后,通过 \1 反向引用访问)href=" 子字符串和除 " 之后的任何零个或多个字符,然后仅匹配 .html 子字符串
  • \1" - 替换为 Group 1 和 " char
  • g - 一行上的所有非重叠事件。

【讨论】:

  • 所以这有效并且确实从所有 HREF 链接中删除了 .html 扩展名,但由于某种原因,这不会递归地遍历每个子目录。
  • @spencerthayer 试试find . -type f -name '*.html' -print0 | xargs -0 sed -i -E 's/(href="[^"]*)\.html"/\1"/g',见How to do a recursive find/replace of a string with awk or sed?
猜你喜欢
  • 2016-02-02
  • 2012-08-07
  • 2015-01-10
  • 2021-04-18
  • 2012-04-05
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多