我正在尝试设置一个等于字符串中的子字符串的变量,该字符串始终以 开头cse
,之后有 3-5 个字符。
例如,如果输入字符串是
http://website.com/class/cse111/homework2/test.html
我只想提取
cse111
从这个字符串。
我努力了
coursenum=$(grep -o '[^cse]...')
但它不起作用。有谁知道如何处理这个问题?
谢谢你,
答案1
你的正则表达式是错误的。grep -Eo 'cse[^/]{3,5}'
将工作。
cse
按字面意思匹配字符串[^/]{3,5}
匹配后面 3 到 5 个不存在的字符/
如果相关部分始终是用 分隔的第五个字段,/
则可以使用cut -d/ -f5
它来代替。
答案2
如果您向我们展示的分配命令实际上就是脚本中的内容,则存在两个问题。
首先,您的任务的正则表达式是错误的。你的表达式会寻找一个字符串不是以
c
,s
, 或e
, 开头(这是[^cse]
实际执行的操作),第一个字符后紧跟着三个任意字符 (...
),因此无论如何它总共只会获得四个字符。其次,你错过了 的论点
grep
。
如果您正在使用bash
,并且源字符串存储在变量中$courseurl
,则可以使用
coursenum="$(grep -o 'cse[^/]\{3,5\}' <<< "$courseurl")"
在不支持“here-strings”的其他 shell 上,使用
coursenum="$(echo "$courseurl" | grep -o 'cse[^/]\{3,5\}')"
除此之外,如果课程编号始终是课程 URL 的第三个组成部分,@ArkadiuszDrabcyz 的评论和 @Devon 的解决方案会为您指明正确的方向。
一般来说,如果您不熟悉正则表达式,我建议您查看诸如正则表达式或者正则表达式101允许您测试正则表达式并查看它们是否符合您的要求。
答案3
如果您想要/
字符串中的第 5 个分隔字符串:
$ cut -d '/' -f 5 <<<'http://website.com/class/cse111/homework2/test.html'
cse111
cse
如果您想要以 开头并以 结尾的字符串/
:
$ grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html'
cse111
然后在命令替换中使用其中任何一个,例如
num=$( grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html' )
请注意,[^cse]
匹配任何单身的不是c
,s
或e
, 并且.
匹配任何单个字符的字符。
答案4
您还可以使用以下方法解决此问题sed
coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")
或者使用 bash 参数替换
coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}