bash 2.0字符串匹配

时间:2015-05-21 21:37:05

标签: regex bash

我在GNU bash上,版本 2.05 b.0(1)-release(2002)。我想确定$1的值是否是/path/*.log/etc/logrotate.conf/path/actual.log规则之一的路径。它不是我的盒子所以我无法升级它。

编辑:我的真实目标是logrotate -d /etc/logrotate.conf回答它是否已经由logrotate管理,或者是否所有当前规则都错过了它。我想知道我的脚本应该只运行/path/actual.log并查看输出中是否#。这似乎更简单,涵盖了所有情况,而不是其他方法。

但我仍然想知道如何在Bash 2.0中进行字符串匹配...

  • 该行本身可以从一些空格开始,或者没有
  • 如果它在注释行中则不匹配(注释是第一个非空白字符为$1的行)
  • $1左侧的同一行上可以有一条或多条路径
    • ,如果/my/path/*.log/other/path*.log /yet/another.log /my/path/*.log {并且有问题的行是。{li>
      • {
  • 右边可以有一条或多条路径
  • 该行本身可以以registration ID结尾,甚至更多的空格
  • 路径可以包含在双引号中,也可以不包含在
  • 可以假设该文件是有效的logrotate conf文件。

我有一些似乎在Bash 4中有效但在Bash 2.05中没有的东西。我在哪里可以阅读Bash 2.0支持的内容?如何在Bash 2.0中检查匹配?

1 个答案:

答案 0 :(得分:2)

您可以找到简洁的bash更改日志here

你会看到=~,正则表达式匹配运算符,直到3.0版才会被引入。

因此,您最好的选择是使用实用程序为您执行正则表达式匹配; e.g:

if grep -Eq '<your-extended-regex>' <<<"$1"; then ...

grep -Eq '<your-extended-regex>' <<<"$1"

  • IS 与Bash 3.0+中的[[ $1 =~ <your-extended-regex> ]]类似其退出代码表示$1的字面值是否与扩展正则表达式<your-extended-regex> <匹配/强>
    • 请注意,Bash 3.1更改了RHS的解释,将引用的(子)字符串视为文字
    • 另请注意,grep -E可能会支持略有不同的正则表达方言。
  • ,因为grep解决方案无法返回捕获组;相比之下,Bash 3.0+通过特殊的数组变量${BASH_REMATCH[@]}提供整体匹配和捕获组。