2009-12-10 71 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 
相關問題