藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 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]

請教多行匹配問題

頂上去~~~~給更多的人看到斑竹的解答方法...我想不止我一個人遇到這個問題吧



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com