仅在特定字符串中替换字符

时间:2014-09-10 10:00:10

标签: regex linux bash awk sed

我需要更换每一个" _"用" - "在html文件中但仅在标签中,仅在" name"属性。

所以每一个:

<a name="menu_portlet_test"> or <a name="whatever_is_here">

应该成为这个:

<a name="menu-portlet-test"> and <a name="whatever-is-here">

无法弄清楚如何强制使用像sed / awk这样的东西。救命啊!

2 个答案:

答案 0 :(得分:2)

sed ':a
s/\(<[^>]* name="[^"]*\)_\([^"]*"\)/\1-\2/g;ta' YourFile

你应该做大部分工作。由于顶级html的可能性不完美,但应该是99,9%好

<强>的解释

s//g

  • 搜索模式(<后跟任何非>([^>] ) followed by名称=&#34; followed by (any non&#34; ( [^&#34;] ) ) [ as group 1] followed by [so first between quote after name=] followed by ( any non&#34; ( [^& #34;] * ) followed by&#34;`)[作为第2组]
  • 将其替换为第1组的内容,然后是-,然后是第2组的内容
  • g在线路上发生任何事情。这个改变1 _每个名字=&#34;&#34;但在线的任何名称=。 <... name="bla_bla_bla"> ... <... name="other_bla_bla"> ...更改为<... name="bla-bla_bla"> ... <... name="other-bla_bla"> ...

ta

  • 如果在之前的s//中发生了更改,则使用修改后的内容重做相同的操作(实际上它是标记为:a的if / goto)

答案 1 :(得分:1)

使用正确的HTML处理工具,例如xshPerl's XML::LibXML的包装器。以下命令可以保存在脚本中,也可以从其交互式环境中输入:

open :F html file.html ;
for //@name set . xsh:subst(., '_', '-', 'g') ;
save :b ;