【问题标题】:Match URL link from input string匹配输入字符串中的 URL 链接
【发布时间】:2010-02-07 03:22:22
【问题描述】:

如何匹配这个字符串中的 URL 地址,我有其他匹配文本的代码,它似乎可以工作,但是当我在这里尝试使用它时,它没有,它一直说“没有这样的文件或目录。我不知道 grep -o 只对文件有效?

matchString='url={"urlPath":"http://www.google.com/","thisIsOtherText"'
array=($(grep -o 'url={"urlPath":"([^"]+)"' "$matchString"))
grep: url={"urlPath":"http://www.google.com/","thisIsOtherStuff": No such file or directory

无论如何,请您帮我匹配“matchString”变量中的 URL(它不必使用 grep)。

首选输出:http://www.google.com/

【问题讨论】:

    标签: regex linux bash sed grep


    【解决方案1】:

    你需要将echo的字符串通过管道传递给grep

    array=($(echo "$matchString" | grep -o 'url={"urlPath":"([^"]+)"'))
    

    Grep 从文件或标准输入中读取。它不接受要在其中搜索的字符串参数。

    另外,grep 将输出整个匹配项,而不是括号中的部分。您可能需要使用sed

    array=($(echo "$matchString" | sed 's/url={"urlPath":"\([^"]\+\).*"/\1/'))
    

    sed 命令的工作方式如下:

    • s/// 是替代命令及其分隔符。为方便起见,您可以使用另一个分隔符,如果它使表达式更具可读性或有助于消除必须进行一些转义。前两个分隔符之间是我们想要更改的。中间和最后一个之间是我们要改成的。

    • url={"urlPath":" 只是我们用来帮助​​匹配的文字文本

    • \( \) 包含一个捕获组。落在这之间的是我们想要抓住的东西。

    • [^"] 匹配任何不是双引号的字符

    • \+ 匹配一个或多个前面的模式。所以,在这种情况下,这是一个或多个不是引号的字符。

    • .* 匹配零个或多个任意字符。在这种情况下,它从google.com/ 之后的引号开始,一直到字符串的末尾。

    • \1 输出第一个(并且仅在本例中)捕获组捕获的内容。

    视觉上:

    url={"urlPath":"http://www.google.com/","thisIsOtherText" -----文字---- -------非引号----- ---任何字符--- url={"urlPath":" \( [^"] \) .*

    【讨论】:

    • 干杯,sed 的作品。不确定我的其他代码如何与 grep 一起使用,但我认为它可能是文件。
    • 你能否解释一下那里的正则表达式是如何工作的以及\1?
    • 谢谢!非常详细。如果可以的话,我会给你两个滴答声:)
    【解决方案2】:

    我不熟悉grep,但对正则表达式有所了解。

    您可能需要为 "

    添加转义符
     array=($(grep -o 'url\=\{\"urlPath\"\:\"([^\"]*)\"' "$matchString"))
    

    【讨论】:

    • 用户:~# array=($(grep -o 'url\=\{\"urlPath\"\:\"([^\"]*)\"' "$matchString" )); echo "$array" grep: Unmatched \{ user:~# array=($(grep -o 'url\={\"urlPath\"\:\"([^\"]*)\"' "$matchString")); echo "$array" grep: : 没有这样的文件或目录
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2017-08-15
    • 2011-06-08
    • 2018-01-04
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多