Min*_*int 2 regex linux bash grep sed
我如何匹配此字符串中的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
Run Code Online (Sandbox Code Playgroud)
无论如何,你能不能帮助我匹配"matchString"变量中的URL(它不必使用grep).
首选输出:http://www.google.com/
你需要echo通过管道的字符串grep:
array=($(echo "$matchString" | grep -o 'url={"urlPath":"([^"]+)"'))
Run Code Online (Sandbox Code Playgroud)
Grep从文件或标准输入读取.它不接受在其中搜索的字符串参数.
此外,grep将输出整个匹配,而不是括号中的部分.你可能需要使用sed.
array=($(echo "$matchString" | sed 's/url={"urlPath":"\([^"]\+\).*"/\1/'))
Run Code Online (Sandbox Code Playgroud)
该sed命令的工作方式如下:
s///是替代命令及其分隔符.如果它使表达式更具可读性或有助于消除必须进行一些转义,则可以使用另一个分隔符以方便使用.在前两个分隔符之间是我们想要改变的.在中间和最后一个之间我们想要改变它.
url={"urlPath":" 只是我们用来帮助匹配的文字文本
\( \)包含一个捕获组.这里有什么是我们想要抓住的东西.
[^"] 匹配任何不是双引号的字符
\+匹配前面一个或多个模式.因此,在这种情况下,这是一个或多个不是引号的字符.
.*匹配零个或多个任何字符.在这种情况下,它从后面的引号开始google.com/并转到字符串的结尾.
\1 输出第一个(仅在这种情况下)捕获组捕获的内容.
视觉:
url={"urlPath":" http://www.google.com/ ","thisIsOtherText"
-----literal---- -------non-quote------ ---any character---
url={"urlPath":" \( [^"] \) .*