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

Bash 如何使用sed正则表达式模式匹配,bash,sed,Bash,Sed,我正在学习bash,我正在尝试解析网页()并提取href o f使用sed计算利息。我使用的模式是: /<a\shref=\'\/ssl-address\/data\/([^\"]*)\'>/siU //siU 但是,我无法将该表达式用于sed。当我跑步时: data=$(wget ${serviceUrl} -q -O -) parsedData=$(sed '/<a\shref=\'\''\/ssl-address\/data\/([^\"]*)\'\''>/si

我正在学习bash,我正在尝试解析网页()并提取href o f使用sed计算利息。我使用的模式是:

/<a\shref=\'\/ssl-address\/data\/([^\"]*)\'>/siU
//siU
但是,我无法将该表达式用于sed。当我跑步时:

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

parsedData=$(sed'//siU/'这就是您想要做的吗

$ 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中以获取interpretation,然后使用双引号,除非您需要shell对其执行全局绑定和文件名扩展,然后不使用引号。

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

你的网页是你在评论中告诉我们的,所以你首先需要下载它。 请注意,在更改下载页面源代码的方式时,您可以更改一些内容(例如,从Firefox控制台复制粘贴它,您将拥有
href=“
,使用
wget
您将拥有
href=”

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

# 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 "s/.*href='\([^']*\)'.*/\1/"
它说,“匹配任何
*
字符,后跟文字字符
href='
字符以外的任何字符
[^']*
(我们使用
\(
..
\)
符号捕获),后跟
'
字符,后跟任何字符”


注:我使用了
sed
表达式括起来,以避免您必须引用

您不能将
regex
与非正则语言一起使用!!@Azhy我完全可以。想打赌吗?不建议同时使用它们,这是一个简单的错误示例:在标记后面说
/s
e它只是一个空格,虽然有时会有几个空格和许多其他错误。@Azhy这与(非)正则语言无关。所以你是说我无法实现我使用bash尝试实现的目标?干杯,这达到了预期的结果。你能扩展表达式以省略包含“示例”的HREF吗?没有“例如"在我发布的脚本的输出中有,所以我不确定您要求的是什么。一旦我们看到示例输入/输出,我希望所有内容都会变得清晰,因此,第三次或第四次,请将我们的问题包括简洁、可测试的示例输入和预期输出,以便我们可以帮助您。如果有您不想要的URL或其他任何不需要考虑的URLHEN包含在你的问题的例子中。@ EdMorton,你可以遵循这个链接,然后显示页面源来查看输入。是否有一个BASH风格指南,在这个地方,你对单V双引号做了这个强烈的看法?我认为可读性比这里的可移植性要重要得多。我已经看过这个页面了。我已经在上面运行了我的脚本,输出中没有“示例”HREF,OP询问我是否可以修改脚本以忽略包含“示例”的HREF。现在怎么办?使用
\'''
而不是
'
对可读性的影响可以忽略不计,但是使用
而不是
的作用是让您搜索脚本,以找到编写脚本的人需要这样做的原因,和/或确保脚本中没有“gotchas”,shell会意外地解释脚本的某些部分。因此,IMHO使用
“…”\''''''
编写脚本的可读性比
“…”要好一点。”
但这几乎是一个清洗。干杯,这达到了预期的结果。@DMcg这就是你想要达到的吗?仅供参考,你不需要在sed中使用
/
作为分隔符-你可以编写
s:foo/bar:
,而不用编写
s:foo/bar:
,因为它不是分隔符。
sed -e "/<a href='.*/! d" -e "/<a href='\/ssl-address\/examples.*/d" -e "s/<a href='\/ssl-address\/data\/\(.*\)'.*/\1/" ssl-address
sed -e "s/.*href='\([^']*\)'.*/\1/"