bash grep -E 单引号表达式的字符串扩展

bash string expansion for grep -E expression in single quotes

在 bash 脚本中,我试图为 grep -E 构造一个字符串,使其显示为

grep -E 'alice|bar|bob|foo' 

如果我在命令行测试 grep-- ls * | grep -E 'alice|bar|bob|foo'-- 一切都按预期工作。它排除了所有与扩展正则表达式中的列表同名的文件。

我发现的问题是,如果我将字符串构造为 'alice|bar|bob|foo'

,它不会匹配 bash 脚本中的第一个和最后一个字符串

损坏的测试用例:

#!/bin/bash

触摸 foo.txt bar.txt alice.txt bob.txt
touch alice.tmp bob.tmp foo.tmp crump.tmp dammitall.tmp
EXCLUDE_PATTERN=$(echo *.txt | sed 's/\.txt /|/g' | sed 's/\.txt//')
EXCLUDE_PATTERN="'""$EXCLUDE_PATTERN""'"
回声 "Excluding files that match the string $EXCLUDE_PATTERN"

对于 *.tmp 中的文件
做
  如果回声$文件 | grep -q -E $EXCLUDE_PATTERN
  然后
    回声 "Keeping $file"
  别的
    回声 "Deleting $file"
    rm -f $文件
  菲
完毕

输出:

排除匹配字符串 'alice|bar|bob|foo' 的文件
正在删除alice.tmp
保持 bob.tmp
删除 crump.tmp
删除 dammitall.tmp
正在删除foo.tmp

...但我不希望它删除 alice.tmp 或 foo.tmp 因为它们在正则表达式中!

我假设 shell 正在获取一些字符,但在此脚本中扩展字符串时却没有,但我终究无法弄清楚字符串以何种方式传递给 grep -E 正在被上面的 "broken" 脚本处理。

EXCLUDE_PATTERN="'$EXCLUDE_PATTERN'" 之类的变体似乎没有帮助。还没有找到神奇的字符串。

编辑以包含以下有用的评论:

使用 set -x 表示 bash 进行单引号换行,所以上面的错误代码 EXCLUDE_PATTERN=''\''alice|bar|bob|foo'\''' 只是在单引号周围添加单引号。

为什么要添加单引号?只需删除这一行:

 EXCLUDE_PATTERN="'""$EXCLUDE_PATTERN""'"

我在没有该行的情况下得到以下信息:

 Excluding files that match the string alice|bar|bob|foo
 Keeping alice.tmp
 Keeping bob.tmp
 Deleting crump.tmp
 Deleting dammitall.tmp
 Keeping foo.tmp