regex - 如何在没有 Perl 的情况下使用 grep 在 ash 中进行非贪婪解析
问题描述
您好我正在尝试解析文件夹结构,并将目录中的前两个文件夹传递给变量。现在我正在使用正则表达式'/. ?/. ?/' 工作正常,除了我在 OpenWRT 上的 ash 版本不支持 Perl,因此 "? 被忽略。我该如何解决这个问题?
var2=$(echo "$TR_TORRENT_DIR" | grep -Eio '\/.*?\/.*?\/')
echo $var2
解决方案
使您的正则表达式更具体。
一般来说,使用非贪婪修饰符是一个危险信号。它应该让您考虑是否可以以更具体的方式重写您的正则表达式(因此量词是否贪婪并不重要)。
在这种情况下,问题是.*
(另一个标志),它匹配得太多了。
如果您使用[^/]
而不是.
,您可以避免所有问题:
/[^/]*/[^/]*/
将匹配前两个组件,仅此而已。(此外,没有必要 escape /
;它在正则表达式中并不特别。)
推荐阅读
- c# - 从 C# 中的字符串列表中删除前导和尾随空格
- sql - 在 Oracle PL/SQL 中复制 SAS DO 循环
- regex - 尝试使用两个不同的文本来定位相同的元素,使用 .withText 用于不同的环境
- python - 从另一个 python 脚本执行 python 文件,如果 python 文件具有嵌套函数则失败
- javascript - Chrome 扩展内容脚本无法检索 DOM 元素
- css - What is the extra space to the right of this button?
- excel - 根据表格的行创建一个新的 Excel 文件,同时将表格值的相应行复制到新文件中
- ruby-on-rails - 带有附加参数的链接到 root_path 不起作用
- laravel - 执行“VBoxManage”宅基地时出错
- python - 为什么使用 matplotlib 在饼图中没有得到正确的百分比?