我正在学习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
我在做什么错了?
答案 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
。