[英]Regex for matching directory path depth
我正在尝试使用 bash 脚本匹配不同路径字符串的特定文件夹深度的正则表达式。
我想从packages
中匹配两个级别,例如。 /packages/[any-folder-name]/[any-folder-name]/
。
因此,例如对于/packages/frontend/react-app/src/index.ts
我想匹配/packages/frontend/react-app/
并将其存储在一个数组中
array=()
string="/packages/frontend/react-app/src/index.ts"
[[ $string =~ packages/.*/.*/ ]] && array+=(${BASH_REMATCH[0]}
几乎可以工作,但它返回/packages/frontend/react-app/src/
我已经在这个问题上转了几个小时了。
大概是这样的:
#!/usr/bin/env bash
array=()
string="/packages/frontend/react-app/src/index.ts"
[[ $string =~ packages/([^/]+/){2} ]] && array+=("${BASH_REMATCH[0]}")
解释:
[^/]+
匹配任何不包含/
的非空字符串。
$ echo '/packages/frontend/react-app/src/index.ts' | sed 's|^\(/packages/[^/]*/[^/]*/\).*$|\1|'
/packages/frontend/react-app/
解释:
sed
正则表达式:|^...$|
- 匹配整个字符串,锚在开头和结尾^\(...\)
- 捕获括号内的内容/packages/
- 期待这个文本[^/]*/
- 后跟任何非斜杠,后跟斜杠[^/]*/
- 冲洗并重复.*
- 在捕获的文本之后丢弃任何内容|\1|
- 用捕获的文本替换匹配的文本看起来像 glob 表达式就足够了。
# enable nullglob to get an empty array if there is no match
shopt -s nullglob
array=(/packages/*/*/)
echo ${array[*]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.