如何用sed仅替换href属性双引号内的下划线为短横线?
解决sed仅替换href属性引号内下划线的问题
现有HTML内容如下:
Parent_topic: Sample_html_page
需要仅将href属性双引号内的下划线(_)替换为短横线(-),但之前使用sed -e "/href/s/_/-/g" index.html会替换整行所有下划线(比如Parent_topic、Sample_html_page里的下划线也会被修改),正确的sed实现方法如下:
方法1:基础循环替换匹配
执行以下命令:
sed -e ':loop' -e 's/\(href="[^"]*\)_\([^"]*"\)/\1-\2/' -e 't loop' index.html
命令解释:
:loop:定义一个循环标签,用于重复执行替换操作s/\(href="[^"]*\)_\([^"]*"\)/\1-\2/:- 通过括号捕获两个分组:第一个分组匹配
href="到第一个_之前的所有内容,第二个分组匹配_之后到闭合双引号"的所有内容 - 将匹配到的
_替换为-,保留前后分组的内容不变
- 通过括号捕获两个分组:第一个分组匹配
t loop:如果上一次替换操作成功执行,就跳转到loop标签继续循环,直到href引号内的所有_都被替换完成
方法2:扩展正则简化写法(GNU sed等支持)
如果你的sed支持扩展正则,可以用更简洁的命令:
sed -E -e ':loop' -e 's/(href="[^"]*)_([^"]*")/\1-\2/' -e 't loop' index.html
执行后,href="../some_text_here_a_b"会被修改为href="../some-text-here-a-b",而其他位置的下划线(如Parent_topic、Sample_html_page)会保持不变。
内容的提问来源于stack exchange,提问作者sagar
相关产品推荐
相关产品推荐

