用sed替换_到 - 但只在href-attribute中

时间:2011-02-07 18:53:31

标签: regex sed replace

我想替换像:

这样的文本片段
<strong>Media Event &quot;New Treatment Options on November 4&ndash;5, 2010, in Paris, France<br /></strong><a href="/news/electronic_press_kits/company_media_event_trap_eye.php">&gt;&gt; more</a>  

所有带有破折号的下划线。但仅限于href属性。由于有数百个文件,最好的方法是使用sed或一个小shellcript来处理这些文件。

我从

开始
\shref=\"([^_].+?)([_].+?)\" 

但这只匹配1 _并且我不知道_的数量,并且我坚持如何动态地替换未知数量的反向引用中的下划线。

2 个答案:

答案 0 :(得分:1)

正则表达式根本就是这项工作的错误工具。必须匹配太多的上下文。

相反,你需要编写一些逐字符的东西,有两种模式:一种只复制所有输入,另一种用短划线替换下划线。在找到href的开始时它进入第二模式,在离开href时它返回到第一模式。这基本上是一种有限形式的标记化器。

答案 1 :(得分:1)

一个专门用于处理HTML的工具是最好的,因为尝试使用正则表达式来处理它可能会导致 madness

但是,假设每行只有一个href,您可以使用这种分而治之的技术:

sed 's/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/;:a;s/\(\n.*\)_\(.*\n\)/\1-\2/;ta;s/\n//g' inputfile

说明:

  • s/\(.*href="\)\([^"]*\)\(".*\)/\1\n\2\n\3/ - 在href
  • 的内容周围添加换行符
  • :a;s/\(\n[^\n]*\)_\([^\n]*\n\)/\1-\2/;ta - 在换行符之间的文本中逐个替换下划线,如果进行了替换,则t分支到标签:a
  • s/\n//g - 删除第一步中添加的换行符