我繼承了一個平坦的HTML文件有幾百行與此類似:插入雙引號多次到字符串
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
到目前爲止,我一直沒能制定出將封閉的SED方式每個元素的雙引號。可能需要sed之外的東西來做到這一點。任何人都可以提出一個簡單的方法來做到這一點? 感謝
我繼承了一個平坦的HTML文件有幾百行與此類似:插入雙引號多次到字符串
<blink>
<td class="pagetxt bordercolor="#666666 width="203 colspan="3 height="20>
</blink>
到目前爲止,我一直沒能制定出將封閉的SED方式每個元素的雙引號。可能需要sed之外的東西來做到這一點。任何人都可以提出一個簡單的方法來做到這一點? 感謝
一個解決方案,彈出我是通過尋找報價文件的每一行進行解析。當它發現一個,啓動一個標誌,以保持的是一個帶引號的區域內的軌道,然後繼續解析線,直到它遇到第一個空間或>談到,只是前插入一個額外的「翻轉標誌關閉,然後繼續通過串尋找下一個報價。也許不是一個完美的解決方案,而是一個開始也許。
如果所有線路共享相同的結構,你可以使用一個簡單的文本編輯在全球範圍內與
取代' bordercolor'
'" bordercolor'
(不含單引號)。然後這是從字段值獨立出來的,並且對於其他字段的作用類似。你仍然需要做一些手工的工作,但如果它只是一個大文件,我硬着頭皮這段時間,不要浪費可能更多的時間工作了一個sed的解決方案。
這應該做的,如果你的文件很簡單 - 如果你有空白這應該是引號內它不會工作 - 在這種情況下,將需要更復雜的代碼,但可以沿着相同的路線來完成。
#!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()
sed -i 's/"\([^" >]\+\)\(\|>\)/"\1"\2/g' file.html
說明:
"
- 領先雙引號\([^" >]\+\)
- 非引號或空間 - 或 - '>
' 字符,分組(成組1)\(\|>\)
- 終止空間或 '>
',分組(成組2)我們與 '"<group1>"<group2>
' 代替它。
正則表達式是您的朋友:
查找:(="[^" >]+)([ >])
替換:\1"\2
後你這樣做,一定要運行這一個了:
尋找:</?blink>
替換:\n
(這不會解決一個元素多個類,如<element class="class1 class2 id="jimmy">
)
爲什麼'([|>])'而不是'([>])或'(|>>)'? – dubiousjim 2010-02-23 11:04:29
我想我是被超顯式的。 – Seth 2010-02-23 17:11:26
使用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
是 - 我知道這是可以實現通過大多數語言中的「簡單」正則表達式 - per,sed,python等......但是這種正則表達式的邏輯無關於上面代碼片段完全表達的邏輯。正因爲正則表達式會更短,這並不意味着它會更簡單。 – jsbueno 2009-12-10 16:41:20
傑出的jsbueno是一種魅力 - 非常感謝:) – 2009-12-10 16:46:08