我想替换像:
这样的文本片段<strong>Media Event "New Treatment Options on November 4–5, 2010, in Paris, France<br /></strong><a href="/news/electronic_press_kits/company_media_event_trap_eye.php">>> more</a>
所有带有破折号的下划线。但仅限于href属性。由于有数百个文件,最好的方法是使用sed或一个小shellcript来处理这些文件。
我从
开始\shref=\"([^_].+?)([_].+?)\"
但这只匹配1 _并且我不知道_的数量,并且我坚持如何动态地替换未知数量的反向引用中的下划线。
答案 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
- 删除第一步中添加的换行符