2012-08-11 80 views
0

我做了一個Bash腳本來下載此頁面http://php.net/downloads.php,然後搜索第一次出現的最新的PHP文件名,版本和MD5sum。現在我有它的工作,但分解成兩個不同的sed命令。當我嘗試將正則表達式放入單個文件時,它不會匹配。我相信這與現在的新線有關。
如何使用單個sed模式,我可以在數組中獲得所有三個匹配(首選)或用空格分隔。匹配和提取文件中的多行模式

順便說一句,它不一定是sed。我只想要腳本將運行的系統可能會工作,所以沒有perl的例子。

wget -q http://php.net/downloads.php 
FILE_INFO=$(sed -nr "s/.*(php-([0-9\.]+)\.tar\.bz2).*/\1 \2/p;T;q" downloads.php) 
MD5SUM=$(sed -nr "s/.*md5: ([0-9a-f]{32}).*/\1/p;T;q" downloads.php) 

echo $FILE_INFO 
echo $MD5SUM

這些是有問題的文件中的兩行,它需要提取的信息:

<a href="/get/php-5.4.5.tar.bz2/from/a/mirror">PHP 5.4.5 (tar.bz2)</a> [10,754Kb] - 19 July 2012<br /> 
    <span class="md5sum">md5: ffcc7f4dcf2b79d667fe0c110e6cb724</span>
+0

它們總是以相同的順序嗎?然後只有在打印第二個後才能退出。在'sed'手冊頁中查找'T'和't'。 – tripleee 2012-08-11 20:55:51

回答

1

這可能爲你工作(GNU SED):

sed '\|<a href="/get/php|!d;N;s/.*\(php-\([0-9\.]\+\)\.tar\.bz2\).*md5: \([0-9a-f]\{32\}\).*/\1 \2 \3/;q' file 
+0

接受你的答案,因爲它更多的是我想要的,它只返回問題中指定的第一個發生。謝謝。 – 2012-08-16 02:40:27

1
sed -nr 's/.*(php-([0-9\.]+)\.tar\.bz2).*/\1 \2/p;s/.*md5: ([0-9a-f]{32}).*/\1/p;T;' downloads.php 
+0

在匹配模式的所有出現方面效果很好:)。我該如何做到這一點,它只是匹配第一次出現,並返回3個字符串的文件名,版本和MD5?感謝您及時的回覆! – 2012-08-11 21:13:30

+0

如果答案不起作用,爲什麼會被接受? – tripleee 2012-08-12 06:09:05

+0

它確實有效,但它匹配了所有這種模式的發生,這並不是原始問題所要求的。 Stephane的解決方案只匹配每種模式的第一次出現,從而爲我的問題提供了準確的解決方案。我希望我能分裂接受,如果有辦法請告訴我,我會的。本網站的新用戶。 – 2012-08-16 04:22:46