【问题标题】:How to retrieve url from string in shell?如何从shell中的字符串中检索url?
【发布时间】:2013-05-06 08:19:57
【问题描述】:

我想用 shell/bash 脚本从字符串中提取 url,如果字符串中有多个 url,则只返回第一个。

我在下面提供了一些输入和输出字符串的示例。我猜我需要做一些正则表达式,但我不太熟悉如何在 bash/shell 中做到这一点?

Input: Take a look at this site: http://www.google.com/ and you'll find your answer
Output: http://www.google.com/


Input: http://www.google.com
Output: http://www.google.com


Input: Check out http://www.bing.com and http://www.google.com
Output: http://www.bing.com


Input: Grettings, visit <http://www.mywebsite.com> today!
Output: http://www.mywebsite.com

【问题讨论】:

  • 您有什么尝试解决这个问题的吗?如果您告诉我们您到目前为止所做的尝试,我们将更愿意回答您的问题。 (提出更好问题的有用链接:How to AskFAQ
  • 现在我已经考虑过了,我同意。但我试图在谷歌上搜索它并没有找到准确的答案。我对 bash 或正则表达式都不太熟悉,所以它不是最好的组合。但我应该事先进行更多研究。

标签: regex string bash shell grep


【解决方案1】:

试试这个:

grep -Eo 'http://[^ >]+' yourFile|head -1 

例如:

kent$  echo "Check out http://www.bing.com and http://www.google.com"|grep -Eo 'http://[^ >]+'|head -1 
http://www.bing.com
kent$  echo "Grettings, visit <http://www.mywebsite.com> today"|grep -Eo 'http://[^ >]+'|head -1 
http://www.mywebsite.com

【讨论】:

  • 谢谢,这看起来很有魅力!我将尝试通过这个来谈论自己,我想知道它为什么有效。因此,您执行 grep,默认情况下对每一行进行搜索并返回找到匹配项的整行。由于您启用了 -o 标志,因此仅返回匹配的部分而不是整行。您使用 -E 让 grep 使用扩展的正则表达式并表现得像 egrep。您不只是使用 egrep 有什么特别的原因吗? 'http:// 意味着它必须以 http:// 开头。但是带有 [^ >]+ 的部分我并不完全理解。 | head -1 使得它只返回第一个。
  • 我读了更多, [^ ] 表示它将匹配不在括号内的任何字符。由于 > 和空格在 [] 内,模式匹配将在遇到空格或字符串中的 > 字符时“停止”。之后的 + 确保它一直重复,直到它碰到空格或 >。我是否理解正确?
  • 如果将+ 替换为\+,则不需要-E[^ &gt;]+ 表示任何不是(空格)或&gt;(一次或多次)的字符。如果 url 后面有 &lt;tab&gt;,您可能需要添加 \t,或者如果您的 grep 支持 -P,请使用 -P 'http://[^\s&gt;]+'。你也可以改成https?//....,因为可能有https://url
  • 谢谢!意味着我正确理解了那部分(但我很难向自己解释它,哈哈。你的解释非常好)。由于文本是从 irssi 打印的,因此我可能不会遇到制表符,但感谢您的注意。感谢您的 https 提示。我正要做类似 http|https 的事情,但当然你的要简单得多。非常感谢您的解决方案和解释,我会确保在使用之前了解我使用的任何内容!
  • 很高兴为您提供帮助,@user1015149。所以,并不是每个 OP 都像你一样。他们中的许多人不想学习如何钓鱼,他们只想要鱼,而且最好煮熟。所以下次他们饿了,他们会来问同样的问题,无论问题是简单还是困难。你只是做对了。我必须 +1 你的评论! 在我使用之前,我会确保我理解我使用的任何东西!
【解决方案2】:

使用grep命令,例如:

cat yourinput.txt | grep "your_regex_here"

【讨论】:

  • 他的问题是关于“your_regex_here”部分。也不需要cat
  • "cat is not necessary" 即:您可以将文件名作为 grep 最后一个参数
猜你喜欢
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2012-10-13
  • 2020-03-31
  • 2013-03-26
相关资源
最近更新 更多