|
藍森林 http://www.lslnet.com 2006年6月26日 11:18
請教多行匹配問題
請教一下關於多行匹配的問題
假設我有一個a.html,大致格式如下
<table>
...{3行,內容不定}
</table>
<table>
...{7行,內容不定}
</table>
<table>
...{30行,內容不定}
</table>
我想把前2個<table>和</table>的所有內容都刪除掉,該如何匹配??
我嘗試著用
sed '/^<table\n\{3,7\}^<\/table/d' a.htm
sed '/^<table\n*\{3,7\}^<\/table/d' a.htm
sed '/^<table\n.*\{3,7\}^<\/table/d' a.htm
都沒辦法做到...請教一下如何匹配????謝謝 |
請教多行匹配問題
[code]cat a.html|sed '1,/\/table/d'|sed '1,/\/table/d'
[/code] |
請教多行匹配問題
:lol: :lol: :lol: |
請教多行匹配問題
| 請教多行匹配問題
因為...前兩個<table>和</table>中間還可能出現<table>或</table>的...我抓的那個html是別人寫的,雖然它格式比較規範,利用^能躲開,但是如果遇到不規範的就慘了...
謝謝寂寞烈火的解答,不知道有其他解答否?? |
請教多行匹配問題
如果文件不夠答大到話,用
nl file找出所在行號在提取吧
呵呵,還是讓高手來看看吧 :em06: |
請教多行匹配問題
其實是想寫個天氣小偷...把qq的天氣抓過來的
打算寫成shell定時偷到數據後改頁面。...卡卡...
雖然用php或許有笨辦法,但是還是想用shell來做做,以前有次做多行匹配我就逃避了,不能再躲避了... |
請教多行匹配問題
對於不規範的, 用 sed 力不從心。 awk 則不難。
試試自己寫一個吧。
參考 http://www.lslnet.com/linux/#forum/viewtopic.php?t=428073 |
請教多行匹配問題
那帖子我去看了,不過有點不明白
time sed 's/\([{}]\)/\n\1\n/g' test.c|awk '{ if($1 == "{") {i++; j=1;} else if ($1 == "}") i--; if (i == 0 && j =
= 0 && $0 != "") print; if ( i == 0 ) j=0;} END { if ( i != 0 ) print " Error: Unmatched { and } !!! "}' > aaa
1.首先是sed 's/\([{}]\)/\n\1\n/g' 這裡的\1沒看明白意思
2.awk這裡,沒有用-F指定分割符,那就是用空格來分...那出的$1的值是{的情形..
3.我所請教的問題中,最麻煩的一點是...我只想匹配中間行有3~7行的情形...對於<table>和</table>之間多於7行的,我還是打算保留的(這個想來用awk的判斷可能可以做,但是或許很麻煩...因為有個如果符合3~7行的條件,得回頭去刪除的問題在內)
看來用php逐行讀的方式來做還方便點...或許我的問題有點太刁鑽咯。.. |
請教多行匹配問題
我覺得還是好好研究一下html中,你要刪除內容的結構特點,只要能用shell表現,就沒問題。通常我們這個問題解決不了,一是因為對數據結構特點瞭解不深入,一是因為對shell瞭解的不深入。建議你把那個html文檔貼出來,大家研究一下:) |
請教多行匹配問題
對html文件到處理,通常用perl來處理感覺會更好 ;) |
請教多行匹配問題
試試這個.
根據你提供的文件, 有以下假設:
1. 每行只有一個 <table> 或 </table>
2. <table> 可以嵌套.
[code]
# cat ./a.html
<html><head><title> Test </title></head><body>
<p> Other line 1 </p>
<table><tr><td>
<table><tr><td>
<p> table with 3 lines </p>
</td></tr></table>
</td></tr></table>
<p> Other line 2 </p>
<table><tr><td>
<table><tr><td>
<p> table with 7 lines </p>
<p> table with 7 lines </p>
<p> table with 7 lines </p>
<p> table with 7 lines </p>
<p> table with 7 lines </p>
</td></tr></table>
</td></tr></table>
<p> Other line 3 </p>
<table><tr><td>
<table><tr><td>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
</td></tr></table>
</td></tr></table>
<p> Other line 4 </p>
</body></html>
[/code]
[code]
# cat ./1
#!/bin/awk -f
{
if (match($0,/<table>|<\/table>/)) {
if (substr($0,RSTART+1,1)=="t") {
i++
if (n==0 )
n=NR
}
else
i--
m=NR - n - 1
if (i==0 && n != 0) {
if (m==3 || m==7) {
if (s=="")
s=n","NR"d"
else
s=s";"n","NR"d"
}
n=0
}
}
}
END {
if (i != 0) {
print "Format Error !!"
exit
}
if ( s != "" )
system("sed \""s"\" "ARGV[1])
else
print "No matches found !!"
}
[/code]
運行:
# ./1 a.html
<html><head><title> Test </title></head><body>
<p> Other line 1 </p>
<p> Other line 2 </p>
<p> Other line 3 </p>
<table><tr><td>
<table><tr><td>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
<p> table with lines 9 </p>
</td></tr></table>
</td></tr></table>
<p> Other line 4 </p>
</body></html> |
請教多行匹配問題
lightspeed
你的代碼給出註釋如何? |
請教多行匹配問題
我等一下試一下,謝謝各位朋友的解答
如果成功了,我把代碼貼出來share |
請教多行匹配問題
的確可用...太強了...!!
而且事實上...那個匹配比斑竹給的例子容易,因為中間行的內容都是有縮進的...因此在match那裡,和計算行數那裡都更簡單一些...
斑竹你太強了...!!!
我嘗試著看您的程序,但是依然有點困惑,您看看我理解錯誤的地方,煩勞您指正
[code]
# cat ./1
#!/bin/awk -f
{
if (match($0,/<table>|<\/table>/)) { #這裡表示匹配<table>或</table>
if (substr($0,RSTART+1,1)=="t") { #這裡的RSTART的初始值是??這一句似乎是判斷某個字符為t..???
i++ #開始計算行數
if (n==0 )
n=NR #如果一開始沒有行號,則用這行作為行號
}
else
i--
m=NR - n - 1 #中間的行數
if (i==0 && n != 0) { #如果行數為0或標記號不為0
if (m==3 || m==7) { #當行數為3或7時候...
if (s=="") #這個s是??
s=n","NR"d" #給s賦予初值,沒看明白
else
s=s";"n","NR"d" #這句...也沒看明白,剩下的n=0這些也不懂思路了....
}
n=0
}
}
}
END {
if (i != 0) {
print "Format Error !!"
exit
}
if ( s != "" )
system("sed \""s"\" "ARGV[1])
else
print "No matches found !!"
}
[/code] |
請教多行匹配問題
[code]
# cat ./1
#!/bin/awk -f
{
if (match($0,/<table>|<\/table>/)) { #這裡表示匹配<table>或</table>
if (substr($0,RSTART+1,1)=="t") {
# 當上句 match 匹配成功會自動設置變量 RSTART, 含義為匹配字符串第一個字符在整行中的位置.
# 因此, substr($0,RSTART+1,1) 是取匹配字符串 <table> 或 </table>
# 的第二個字符. 如果是 t, 當然說明匹配的是 <table> 了
i++ # 由於匹配了 <table> , 表嵌套深度加 1
if (n==0 )
n=NR # 紀錄一個表結構最外層開始的行號
}
else
i-- # 匹配了 </table> , 表嵌套深度減 1
m=NR - n - 1 #中間的行數, 這句實際應放在下面 if(m=... 語句之前
if (i==0 && n != 0) { # 嵌套深度為0,但table開始的行號不為0, 說明剛剛完成一個表結構的掃瞄.
# 當然, 如果 i==0 && n==0 則說明沒有遇到表結構
if (m==3 || m==7) { #當表包含行數為3或7時候, 符合刪除條件
# s 是傳給 END 中 sed 的刪除語句, 如 s="2,6d;8,16d"
if (s=="") # 遇到第一個表時賦值,如 s="2,6d"
s=n","NR"d"
else
s=s";"n","NR"d" # 後面的表,需加";" , 如 s=s";8,16d"
}
n=0 # 處理完一個表結構後, 表開始行數復零
}
}
}
END {
if (i != 0) { # 文件中的 <table> 和 </table> 總數不等,因此語法錯誤.
print "Format Error !!"
exit
}
if ( s != "" )
system("sed \""s"\" "ARGV[1]) # 調用 sed 刪除相應的行
else
print "No matches found !!"
}
[/code]
由於 html 是一種自由格式, 因此每一行可能有多個 <table> </table>
那樣的話, 此程序就不靈了. 你可以自己寫一個這種情況的,比較繁瑣, 相信
你的 awk 水平一定會有個大的提高.
此外, 如果 <table> </table> 出現在 <!-- --> 中則失去 tag 含義.
總之, 要想符合各種條件, 幾乎是不可能的. |
請教多行匹配問題
哇,還好我到freebsdchina去看了看帖子,沒有早睡.否則就走寶了
謝謝您,我再看看 |
請教多行匹配問題
啊,謝謝,這次看明白了...
以前我用sed的時候很少用到刪除,即使用到也大多是替換刪除某段...整行刪除還是第一次學習
謝謝老大的註釋,很詳盡清晰,而且很佩服您最後連table不匹配情形都考慮到了...我寫shell經常因為偷懶而不寫容錯或者錯誤反饋...慚愧ing |
請教多行匹配問題
偷qq那裡天氣的...我是在phpwind 2.02里面用
1.sh
[code]#!/bin/awk -f
{
if (match($0,/^<\/table>/)) { #這裡表示匹配</table>
i++
if (i==2) {
s="1,"NR"d"
}
}
}
END {
if ( s != "" )
system("sed \""s"\" "ARGV[1])#調用 sed 刪除相應的行
else
print "No matches found !!"
}[/code]
2.sh
[code]#!/bin/awk -f
{
if (match($1,/^<link/)) { #這裡表示匹配<link
s=NR","NR+10"d"
}
}
END {
if ( s != "" )
system("sed \""s"\" "ARGV[1])#調用 sed 刪除相應的行
else
print "No matches found !!"
}[/code]
然後最後一個weather.sh中調用他們
[code]
#!/bin/sh
wget -b http://appnews.qq.com/cgi-bin/news_weather_list
sleep 20
./1.sh news_weather_list > weathertmp.htm
./2.sh weathertmp.htm > weather.htm
[/code] |
請教多行匹配問題
頂上去~~~~給更多的人看到斑竹的解答方法...我想不止我一個人遇到這個問題吧 |
| |