提取文件中 2 个字符串之间的 url

提取文件中 2 个字符串之间的 url

我有一个文件,其中每一行都是这样的

"372"^""^"2015-09-03 06:59:44.475"^"NEW"^"N/A"^""^0^"105592"^"https://example-url.com"^"example-domain < MEN'S ULTRA < UltraSeriesViewAll (18)"^"New"^"MERCHANT_PROVIDED"

我想提取文件中的网址--https://example-url.com

我使用 sed 命令尝试了这些正则表达式 --sed -n '/"^"http/,/"^"/p'

但这并没有解决我的问题。

答案1

你可以用这个

sed -n 's!^.*\^"\(http[^^]*\)"^.*!\1!p'

RE 初学者的潜在问题是,这^是一个指标行首\^,所以如果你想在 RE 的开头有一个向上的箭头,你必须确保你转义了它。

RE模式匹配可以解释如下

  • ^.*\^"-- 从行首开始匹配,直到看到^"满足模式其余部分的最后一个可能的向上箭头双引号
  • \(-- 启动一个替换块,可以替换为\1
  • http[^^]*-- 匹配http后面尽可能多的字符,不是^越多越好
  • \)-- 结束替换块 "^.*-- 匹配双引号和向上箭头"^,然后尽可能匹配(直到行尾)

整个匹配被替换为\1,这是模式块的开始http

答案2

如果你的 grep 版本支持 PCRE 模式,你可以尝试

grep -Po '(?<="\^")http.+?(?="\^")'

答案3

尝试这个:

echo "372"^""^"2015-09-03 06:59:44.475"^"NEW"^"N/A"^""^0^"105592"^"https://example-url.com"^"example-domain < MEN'S ULTRA < UltraSeriesViewAll (18)"^"New"^"MERCHANT_PROVIDED" | cut -f9 -d^

答案4

如果您的 URL 始终以http引号开头和结尾,您只需搜索该字符串http以及下一个引号之前的所有内容:

  1. grep

    $ grep -o 'https*://[^"]*' file
    https://example-url.com
    
  2. sed

    $ sed -n 's#.*\(https*://[^"]*\).*#\1#;p' file
    https://example-url.com
    
  3. Perl

    $ perl -ne 's#.*(https*://[^"]*).*#\1# && print' file
    https://example-url.com
    
  4. awk您也可以使用稍微不同的方法。只需使用-F将字段分隔符设置为"并打印以 开头的任何字段hhtp

    $ awk -F\" '{for(i=1;i<NF;i++){if($i~/^http/){print $i}}}' file
    https://example-url.com
    

相关内容