【问题标题】:Regex for matching directory path depth匹配目录路径深度的正则表达式
【发布时间】:2020-11-06 23:35:28
【问题描述】:

我正在尝试使用 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/

我已经为此转了几个小时了。

任何帮助表示赞赏!

【问题讨论】:

  • 听起来您可能会从find 中获得一些好处。类似find /packages -maxdepth 2 -type d
  • @xdhmoore 不幸的是,find 无法匹配字符串并捕获字符串的一部分。这不是查找目录,而是提取字符串中包含的路径的特定部分。

标签: regex bash shell


【解决方案1】:

大概是这样的:

#!/usr/bin/env bash

array=()
string="/packages/frontend/react-app/src/index.ts"

[[ $string =~ packages/([^/]+/){2} ]] && array+=("${BASH_REMATCH[0]}")

解释:

[^/]+ 匹配任何不包含/ 的非空字符串。

【讨论】:

    【解决方案2】:
    $ echo '/packages/frontend/react-app/src/index.ts' | sed 's|^\(/packages/[^/]*/[^/]*/\).*$|\1|'
    /packages/frontend/react-app/
    

    解释:

    • 使用sed正则表达式:
    • |^...$| - 匹配整个字符串,锚在开头和结尾
    • ^\(...\) - 捕获括号内的内容
    • /packages/ - 期待这段文字
    • [^/]*/ - 后跟任何非斜线,然后是斜线
    • [^/]*/ - 冲洗并重复
    • .* - 在捕获的文本之后丢弃任何内容
    • |\1| - 用捕获的文本替换匹配的文本

    【讨论】:

      【解决方案3】:

      看起来一个 glob 表达式就足够了。

      # enable nullglob to get an empty array if there is no match
      shopt -s nullglob
      
      array=(/packages/*/*/)
      echo ${array[*]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-30
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        • 2022-08-11
        • 1970-01-01
        相关资源
        最近更新 更多