<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>
我想使用'grep'命令從上面的行中提取「帶3km/h SSW風」字樣(注意這個字符串會改變,所以它不能工作)。我一直在嘗試很久,並完全失去了。任何幫助,將不勝感激。你如何在這條線上使用'grep'? Linux
<span class="cur_wind">with 3km/h SSW winds</span><hr class="hr_sm" /></td>
我想使用'grep'命令從上面的行中提取「帶3km/h SSW風」字樣(注意這個字符串會改變,所以它不能工作)。我一直在嘗試很久,並完全失去了。任何幫助,將不勝感激。你如何在這條線上使用'grep'? Linux
儘量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替換所有出現的xyzs/<[^>]*>//g
變得有趣。我們專注於<[^>]*>
。這意味着,代替任何開始<,不包含立即,但包含任何其他字符,然後有>與空<span class="cur_wind">
例如。該標籤以<開頭,然後緊接着包含字符,然後具有>。 sed
說,找到這樣的文本時,將其砍掉(替換爲空)<hr>
和</td>
。剩下的是你想要的文字這是一個有點簡單的解釋。
謝謝,但這是我作業的一部分,我不允許使用sed或awk – noobcoder
@noobcoder,分配'grep'從提取內容的講師XML不應該有他們的工作。 XML不是一種常規語言,所以使用正則表達式(唯一可用的方法grep)正確解析它並不是理論上可行的。你可以寫出一些不好的近似值,但這只是一個不好的近似值。 –
我確實同意@CharlesDuffy:'grep'不應該是提取數據的工具。 grep是用於匹配/發現......如...從'profanity.txt'文件中找到'荒謬的家庭作業問題'。正如我以前的評論提到的,HTML不應該用正則表達式解析 – zedfoxus
grep
不知道XML,因此是工作的錯誤工具;使用真正的XML解析器。易於從bash訪問的更好的一個是XMLStarlet。
xmlstarlet sel -t -m "//span[@class='cur_wind']/text()" -v . -n <input.xml
這直接提取包含在類cur_wind
的跨度內的所有文本。
這裏的一個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>'
你我輸入是一個XML,最好是使用XML解析器。但是如果你真的想要shell腳本,你可以使用'sed'或'awk'。 – alvits
這麼想,但我不知道如何去做。任何可以幫助我的命令?我是bash的新手 – noobcoder
@alvits ahhhhh不能使用sed或awk,不幸的是 – noobcoder