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
在 bash 脚本中,我试图为 grep -E
构造一个字符串,使其显示为
grep -E 'alice|bar|bob|foo'
如果我在命令行测试 grep-- ls * | grep -E 'alice|bar|bob|foo'
-- 一切都按预期工作。它排除了所有与扩展正则表达式中的列表同名的文件。
我发现的问题是,如果我将字符串构造为 'alice|bar|bob|foo'
损坏的测试用例:
#!/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