代码之家  ›  专栏  ›  技术社区  ›  fregante

在终端中使用regex从字符串中提取字符串[重复]

  •  35
  • fregante  · 技术社区  · 15 年前

    我有一个 一串 喜欢 first url, second url, third url 只想提取 url 词后 second 在OS X终端中(仅第一次出现)。我该怎么做?

    我最喜欢的编辑器 我用的是瑞吉丝 /second (url)/ 并使用 $1 要提取它,我只是不知道如何在终端中进行。

    记住 网址 是实际的URL,我将使用以下表达式之一进行匹配: Regex to match URL

    4 回复  |  直到 8 年前
        1
  •  49
  •   Sjoerd    15 年前
    echo 'first url, second url, third url' | sed 's/.*second//'
    

    编辑:我误解了。更好的:

    echo 'first url, second url, third url' | sed 's/.*second \([^ ]*\).*/\1/'
    

    或:

    echo 'first url, second url, third url' | perl -nle 'm/second ([^ ]*)/; print $1'
    
        2
  •  12
  •   mklement0    8 年前

    连接到另一个进程(如上面建议的“sed”和“perl”)的管道可能非常昂贵,特别是当您需要多次运行此操作时。bash支持regexp:

    [[ "string" =~ regex ]]

    类似于通过使用 $1 , $2 等等,bash填充 $BASH_REMATCH 用所有匹配项数组。

    在您的特定示例中:

    str="first usr1, second url2, third url3"
    if [[ $str =~ (second )([^,]*) ]]; then echo "match: '${BASH_REMATCH[2]}'"; else echo "no match found"; fi
    

    输出:

    match: 'url2'
    

    明确地, =~ 支架 扩展的 正则表达式 as defined by POSIX 但是 平台特定扩展 (范围不同,可能不兼容)。
    在Linux平台上(gnu userland),请参见 man grep ;在MacOS/BSD平台上,请参见 man re_format .

        3
  •  7
  •   mhitza Federico Taschin    15 年前

    在另一个答案中,如果您仍然保留所需URL之后的所有内容。所以我建议你以下的解决方案。

    echo 'first url, second url, third url' | sed 's/.*second \(url\)*.*/\1/'
    

    在sed下,通过转义表达式周围的括号(posix标准)对表达式进行分组。

        4
  •  2
  •   Yeti    8 年前

    尝试这个的时候,你可能忘记了 -E 论证 sed .

    sed --help :

      -E, -r, --regexp-extended
                     use extended regular expressions in the script
                     (for portability use POSIX -E).
    

    你不必改变你的正则表达式,但是你需要添加 .* 贪婪地在它周围配对,去掉绳子的另一部分。

    这对我来说很好:

    echo "first url, second url, third url" | sed -E 's/.*second (url).*/\1/'
    

    输出:

    url
    

    其中输出“url”实际上是字符串中的第二个实例。但是,如果您已经知道它是在逗号和空格之间格式化的,并且您不允许在URL中使用这些字符,那么regex [^,]* 应该是好的。

    可选地:

    echo "first http://test.url/1, second ://test.url/with spaces/2, third ftp://test.url/3" \
         | sed -E 's/.*second ([a-zA-Z]*:\/\/[^,]*).*/\1/'
    

    正确输出:

    ://example.com/with spaces/2