如何在bash中设置变量等于某个子字符串模式?

如何在bash中设置变量等于某个子字符串模式?

我正在尝试设置一个等于字符串中的子字符串的变量,该字符串始终以 开头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,se, 并且.匹配任何单个字符的字符。

答案4

您还可以使用以下方法解决此问题sed

coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")

或者使用 bash 参数替换

coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}

相关内容