![提取文件中 2 个字符串之间的 url](https://linux22.com/image/72363/%E6%8F%90%E5%8F%96%E6%96%87%E4%BB%B6%E4%B8%AD%202%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E9%97%B4%E7%9A%84%20url.png)
我有一个文件,其中每一行都是这样的
"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
以及下一个引号之前的所有内容:
grep
$ grep -o 'https*://[^"]*' file https://example-url.com
sed
$ sed -n 's#.*\(https*://[^"]*\).*#\1#;p' file https://example-url.com
Perl
$ perl -ne 's#.*(https*://[^"]*).*#\1# && print' file https://example-url.com
awk
您也可以使用稍微不同的方法。只需使用-F
将字段分隔符设置为"
并打印以 开头的任何字段hhtp
:$ awk -F\" '{for(i=1;i<NF;i++){if($i~/^http/){print $i}}}' file https://example-url.com