2014-03-29 13 views
0
<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td> 

我想使用'grep'命令從上面的行中提取「帶3km/h SSW風」字樣(注意這個字符串會改變,所以它不能工作)。我一直在嘗試很久,並完全失去了。任何幫助,將不勝感激。你如何在這條線上使用'grep'? Linux

+0

你我輸入是一個XML,最好是使用XML解析器。但是如果你真的想要shell腳本,你可以使用'sed'或'awk'。 – alvits

+0

這麼想,但我不知道如何去做。任何可以幫助我的命令?我是bash的新手 – noobcoder

+0

@alvits ahhhhh不能使用sed或awk,不幸的是 – noobcoder

回答

0

如果那就是你想要的那麼貓| 「與3公里每小時SSW風」 grep應該執行它,但我懷疑還有更多的則是,你需要

+1

OP想要刪除xml標籤並獲取值。 – alvits

+0

是的,你是對的..這會選擇太多 – nPn

1

儘量sed的:

echo '<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>' | sed -e 's/<[^>]*>//g' 

輸出

with 3km/h SSW winds 

說明

  • echo 'whatever'將回顯單詞whatever到屏幕(標準輸出又名標準輸出)
  • |符號是一個管道。右側的命令將採用echo的輸出並對其執行操作
  • sed是流編輯器。它是-e開關告知sed評估腳本或表達式
  • s/xyz/abc/g格式很簡單。 s /意思是替代品。/g意味着全球。用全球abc替換所有出現的xyz
  • s/<[^>]*>//g變得有趣。我們專注於<[^>]*>。這意味着,代替任何開始<,不包含立即,但包含任何其他字符,然後有>與空
  • 例如,檢查出您的<span class="cur_wind">例如。該標籤以<開頭,然後緊接着包含字符,然後具有>。 sed說,找到這樣的文本時,將其砍掉(替換爲空)
  • 相同的技術適用於<hr></td>。剩下的是你想要的文字

這是一個有點簡單的解釋。

+0

謝謝,但這是我作業的一部分,我不允許使用sed或awk – noobcoder

+1

@noobcoder,分配'grep'從提取內容的講師XML不應該有他們的工作。 XML不是一種常規語言,所以使用正則表達式(唯一可用的方法grep)正確解析它並不是理論上可行的。你可以寫出一些不好的近似值,但這只是一個不好的近似值。 –

+0

我確實同意@CharlesDuffy:'grep'不應該是提取數據的工具。 grep是用於匹配/發現......如...從'profanity.txt'文件中找到'荒謬的家庭作業問題'。正如我以前的評論提到的,HTML不應該用正則表達式解析 – zedfoxus

1

grep不知道XML,因此是工作的錯誤工具;使用真正的XML解析器。易於從bash訪問的更好的一個是XMLStarlet

xmlstarlet sel -t -m "//span[@class='cur_wind']/text()" -v . -n <input.xml 

這直接提取包含在類cur_wind的跨度內的所有文本。

2

這裏的一個GNU grep溶液使用-P以激活PCREs支持(Perl兼容正則表達式):

grep -Po '"cur_wind">\K[^<]+' \ 
    <<<'<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>' 
  • -o指定只匹配的字符串被輸出
  • \K是PCRE這個特性能夠降低目前所有匹配的東西;這允許爲更具體的匹配提供上下文而不在匹配中包括該上下文。

另一種選擇是,以代替\K使用向後看斷言:

grep -Po '(?<="cur_wind">)[^<]+' \ 
    <<<'<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>' 

當然,這種匹配的依賴於輸入字符串的特定格式(空格,單引號和雙引號,屬性排序,... - 除了不瞭解數據的結構的基本問題外),因此是脆弱的。

因此,一般情況下,正如其他人指出的那樣,grep是工作的錯誤工具。

OSX,假設輸入的是XML(或XHTML),則可以與股票xmllint效用和XPath表達式魯棒解析:

xmllint --xpath '//span[@class="cur_wind"]/text()' - <<<\ 
'<td><span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>' 

下面是一個使用一個類似的解決方案第三方實用,該multi-platform web-scraping utility xidel(它可以同時處理HTML和XML):

xidel -q -e '//span[@class="cur_wind"]' - <<<\ 
'<td><span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>' 
+0

儘管知道OP的作業是迫使OP使用錯誤的工具來完成工作,不錯的工作+1 – zedfoxus

+0

謝謝@zfus。 – mklement0