繁体   English   中英

匹配目录路径深度的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM