【问题标题】:Match & Extract Multi-line Pattern In File匹配并提取文件中的多行模式
【发布时间】:2012-08-11 20:44:04
【问题描述】:

我制作了一个 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>

【问题讨论】:

  • 它们的顺序总是相同吗?然后仅在打印第二个后退出。在您的 sed 手册页中查找 Tt

标签: regex bash sed match multiline


【解决方案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

【讨论】:

  • 接受你的回答,因为它是我想要的更多,它只返回问题中指定的第一次出现。谢谢。
【解决方案2】:
sed -nr 's/.*(php-([0-9\.]+)\.tar\.bz2).*/\1 \2/p;s/.*md5: ([0-9a-f]{32}).*/\1/p;T;' downloads.php

【讨论】:

  • 非常适合匹配所有出现的模式:)。我如何使它只匹配第一次出现并返回文件名、版本和 md5 的 3 个字符串?感谢您的快速回复!
  • 它确实有效,但它匹配了所有出现的模式,这不是原始问题所要求的。 Stephane 的解决方案仅匹配每个模式的第一次出现,因此为我的问题提供了准确的解决方案。我希望我能分开接受,如果有办法请告诉我,我会的。本网站的新用户。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多