如何使用sed正则表达式模式匹配

时间:2018-07-29 12:49:23

标签: bash sed

我正在学习bash,并且试图解析网页(https://chromium-i18n.appspot.com/ssl-address)并提取href o f使用sed感兴趣。我使用的模式是:

/<a\shref=\'\/ssl-address\/data\/([^\"]*)\'>/siU

但是,我无法使表达式与sed一起使用。当我跑步时:

data=$(wget ${serviceUrl} -q -O -)
parsedData=$(sed '/<a\shref=\'\''\/ssl-address\/data\/([^\"]*)\'\''>/siU/' <<< ${data})
echo ${parsedData}

我收到以下错误:

sed: 1: "/<a\shref=\'\/ssl-addre ...": unterminated substitute pattern

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

这是您要做什么吗?

$ wget 'https://chromium-i18n.appspot.com/ssl-address' -q -O - |
    sed -n 's:.*/ssl-address/data/\([^'\'']*\).*:\1:p'
AC
AD
AD/Canillo
AD/Encamp

我看到您在sed脚本周围使用双引号而不是单引号得到了一些答案,因此您可以使用"...'..."而不是'...'\''...'-虽然很诱人,但对于当前的特定功能,它的功能还可以例如,不要这样做。为了避免现在或以后更改需求时出现任何意外,在所有shell编程中,始终将字符串和脚本用单引号引起来,除非您需要将它们暴露给shell进行解释,然后使用双引号除非您需要外壳程序对其进行遍历和扩展文件名,然后不使用引号。

答案 1 :(得分:1)

好的,您正在尝试解析整个网页。 这种情况需要删除所有不需要的行。 正如@Ed Morton所说,您可以使用sed以外的其他名称。

如您在评论中告诉我们的,您的网页为this,因此您首先需要下载它。 请注意,更改了下载页面源的方式后,您可以进行一些更改(从Firefox控制台粘贴它的EG复制,您将拥有href=",使用wget您将拥有{{1} }。

也就是说,让我们像在当前问题中那样使用wget。

href='

编辑:

阅读您的评论,我看到您想过滤一些输出(例如,删除所有示例链接)

这可以添加一部分# This will create the ssl-address file wget "https://chromium-i18n.appspot.com/ssl-address" # This will give you a list of all of the links in a href. sed -e "/<a href='.*/! d" -e "s/<a href='\/ssl-address\/data\/\(.*\)'.*/\1/" ssl-address 来删除不需要的行。 在您的情况下,您只需要添加sed,因此整个代码行应如下所示:

-e "/<a href='\/ssl-address\/examples.*/d"

答案 2 :(得分:0)

根据输入数据,您可能想要这样的东西:

sed -e "s/.*href='\([^']*\)'.*/\1/"

它说:“匹配任何.*,后跟文字字符href=',然后再匹配'字符[^']*(我们使用{{1} } ... \(符号后跟\)字符,后跟任何字符”。

请注意,我使用'括起"表达式,以避免您不得不引用sed