2009-12-10 73 views
1

我继承了一个平坦的HTML文件有几百行与此类似:插入双引号多次到字符串

<blink> 
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20> 
</blink> 

到目前为止,我一直没能制定出将封闭的SED方式每个元素的双引号。可能需要sed之外的东西来做到这一点。任何人都可以提出一个简单的方法来做到这一点? 感谢

回答

0

一个解决方案,弹出我是通过寻找报价文件的每一行进行解析。当它发现一个,启动一个标志,以保持的是一个带引号的区域内的轨道,然后继续解析线,直到它遇到第一个空间或>谈到,只是前插入一个额外的“翻转标志关闭,然后继续通过串寻找下一个报价。也许不是一个完美的解决方案,而是一个开始也许。

0

如果所有线路共享相同的结构,你可以使用一个简单的文本编辑在全球范围内与

取代

' bordercolor' 

'" bordercolor' 

(不含单引号)。然后这是从字段值独立出来的,并且对于其他字段的作用类似。你仍然需要做一些手工的工作,但如果它只是一个大文件,我硬着头皮这段时间,不要浪费可能更多的时间工作了一个sed的解决方案。

0

这应该做的,如果你的文件很简单 - 如果你有空白这应该是引号内它不会工作 - 在这种情况下,将需要更复杂的代码,但可以沿着相同的路线来完成。

#!usr/bin/env python 

#change the "utf-8" bellow to your files encoding 
data = open("<myfile.html>").read().decode("utf-8") 
new_data = [] 

inside_tag = False 
inside_quotes = False 
for char in data: 
    if char == "<": 
     inside_tag = True 
    if char == '"': 
     inside_quotes = True 
    if inside_tag and (char.isspace() or char==">") and inside_quotes: 
     new_data.append('"') 
     inside_quotes = False 
    if char == ">": 
     inside_tag = False 
    new_data.append(char) 


outputfile = open("<mynewfile.html>", "wt") 

outputfile.write("".join(new_data).encode("utf-8")) 
outputfile.close() 
+0

是 - 我知道这是可以实现通过大多数语言中的“简单”正则表达式 - per,sed,python等......但是这种正则表达式的逻辑无关于上面代码片段完全表达的逻辑。正因为正则表达式会更短,这并不意味着它会更简单。 – jsbueno 2009-12-10 16:41:20

+0

杰出的jsbueno是一种魅力 - 非常感谢:) – 2009-12-10 16:46:08

1
sed -i 's/"\([^" >]\+\)\(\|>\)/"\1"\2/g' file.html 

说明:

  • " - 领先双引号
  • \([^" >]\+\) - 非引号或空间 - 或 - '>' 字符,分组(成组1)
  • \(\|>\) - 终止空间或 '>',分组(成组2)

我们与 '"<group1>"<group2>' 代替它。

0

正则表达式是您的朋友:

查找:(="[^" >]+)([ >])

替换:\1"\2

后你这样做,一定要运行这一个了:

寻找:</?blink>

替换:\n

(这不会解决一个元素多个类,如<element class="class1 class2 id="jimmy">

+0

为什么'([|>])'而不是'([>])或'(|>>)'? – dubiousjim 2010-02-23 11:04:29

+0

我想我是被超显式的。 – Seth 2010-02-23 17:11:26

0

使用bash

for file in * 
do 
    flag=0 
    while read -r line 
    do 
     case "$line" in 
      *"<blink>"*) 
       flag=1 
       ;; 
     esac 
     if [ "$flag" -eq 1 ];then 
      case "$line" in 
       *class=\"pagetxt*">") 
        line="${line%>}\">" 
        flag=0 
        ;; 
      esac 
     fi 
     echo "${line}" 
    done <"file" > temp 
    mv temp "$file" 
done