【问题标题】:How to pass a variable with a regular expression to egrep in bash如何将带有正则表达式的变量传递给bash中的egrep
【发布时间】:2020-01-04 20:58:57
【问题描述】:

我有存储正则表达式的变量,并且我想在本地文件夹中找到与该正则表达式匹配的文件

基本上,我有文件名及其扩展名的正则表达式,我想连接它们,然后在 ereg 中使用它们来搜索文件

所以,下面是它的外观示例:

declare -r CPMOVE_REGEX="^cpmove-[a-z][a-z0-9]{0,16}"
declare -r TAR_REGEX=".tar$"

然后在脚本的某个地方我执行以下操作。

for b in $(ls -1 | egrep "$CPMOVE_REGEX$TAR_REGEX");
do
  backups+=($b);
done
  • 假设备份变量在之前的某个地方声明过。

  • 我知道$CPMOVE_REGEX$TAR_REGEX 是错误的,我想知道如何正确地做到这一点。

【问题讨论】:

标签: bash


【解决方案1】:

使其工作的一种方法是将您的变量放在大括号中:“${CPMOVE_REGEX}${TAR_REGEX}”

实际上,我在发布此消息之前找到了它,但是我错误地命名了我的测试文件,因此它们与正则表达式不匹配。所以,这就是问题所在。

感谢提供答案链接的 Micha Wiedenmann

【讨论】:

  • 花括号在这种情况下应该无关紧要。它们不会受到伤害,但仅当您需要显式控制变量引用的结束位置时才需要它们。也就是说,当变量名后面跟着可能是变量名的一部分但不是(如"${var}text" vs "$vartext")或想要使用复杂扩展(如@ 987654324@)。请参阅this question 了解更多信息。
【解决方案2】:

您的正则表达式的问题不在于扩展部分($TAR_REGEX),而在于第一部分。尝试回显整个字符串 $CPMOVE_REGEX$TAR_REGEX 并在命令行上进行一些测试。当正则表达式正常时,将其放入脚本中。 将两个变量组合成一个字符串没有问题,并将其用作 egrep 参数,就像在这个工作示例中一样:

root@localhost ~ $ declare -r P1='^[0-9]+\-.{3}' root@localhost ~ $ ls | egrep "$P1" 20190315-GO2.sql root@localhost ~ $ declare -r P2='.sql$' root@localhost ~ $ ls | egrep "$P1$P2" 20190315-GO2.sql root@localhost ~ $

【讨论】:

  • 请在这些变量引用周围加上双引号!没有它们,正则表达式可能是一个或多个文件的 gob-pattern-type 匹配,这会造成一团糟。
【解决方案3】:

如何以正确的方式做到这一点。

大概是这样的:

declare -r CPMOVE_REGEX="cpmove-[a-z][a-z0-9]{0,16}"
declare -r TAR_REGEX=".tar"
IFS= readarray -d '' -t backups < <(find . -regextype posix-egrep -regex ".*/$CPMOVE_REGEX$TAR_REGEX" -print0)

pre bashv4 没有-d '' 选项和readarray。如果 bash 低于 v4,则需要一个 while 读取循环:

while IFS= read -r tmp; do
    backups+=("$tmp")
done < <(find . -regextype posix-egrep -regex ".*/$CPMOVE_REGEX$TAR_REGEX" -print0)

但是因为您的文件名中没有空格,您可以使用正则表达式对其进行过滤,那么如果您只对没有目录路径的文件名感兴趣,那么您可能可以阅读换行符分隔的列表。前提是您确定文件名中永远不会有任何换行符。

IFS=$'\n' read -r -a backups < <(find . -regextype posix-egrep -regex ".*/$CPMOVE_REGEX$TAR_REGEX" -print "%f\n")

IFS=$'\n' backups=($(find . -regextype posix-egrep -regex ".*/$CPMOVE_REGEX$TAR_REGEX" -print "%f\n"))

注意事项:

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 2014-08-10
    • 2017-09-11
    • 2020-06-09
    • 2012-01-24
    • 2010-10-04
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多