在 Bourne shell 中查找正则表达式时要转义哪些字符以匹配这些字符?

Which characters to escape to match these in find regex expression in Bourne shell?

我写了一个小的 bourne shell 脚本,它加载一个包含字符串的 conf 文件,这个字符串用于查找(在一些 awk 技巧之后),如下例所示:

原始字符串:

rx='~ #'

查找命令:

find -regex "^.*~$\|^.*#$"

编辑:原始字符串在 conf 文件中,所以问题是当字符串内容特殊字符为“*”时。示例:

原始字符串(带有要转义的字符):

rx='~ # $*'

EDIT2:我试图匹配 rx 中以单​​词结尾的任何文件(用 space 分隔)。如果rx="st ar",我想匹配"test"和"bar"。但是如果这个词包含任何字符作为 * $,我的正则表达式就不能正常工作。所以,我想知道哪些是我必须转义才能使其工作的所有字符。 谢谢 ! :)

据我了解,您想在空格上拆分字符串,并匹配该拆分中的任何子字符串。

irc.freenode.org#bash 频道 has a factoid providing a function for performing quoting,在下面使用,为了 POSIX 兼容性做了一些小调整:

requote() { printf '%s\n' "" | sed 's/[^^]/[&]/g; s/\^/\^/g'; }

input_string='hello# cruel*world how~are~you'
output_string=$(printf '%s\n' "$input_string" | tr ' ' '\n' | {
  out_s=''
  while read -r line; do
    if [ -n "$out_s" ]; then
      out_s="${out_s}|$(requote "$line")"
    else
      out_s="$(requote "$line")"
    fi
  done
  printf '%s\n' "$out_s"
})

find . -regex ".*(${output_string}).*"

好的,感谢 Charles Duffy,我知道好的方法是将任何字符封装在“[]”中,以使其在正则表达式中安全。除了'^',我们做成这样'\^'。这是我根据达菲先生的回答所做的。

所以,我有一个初始字符串,我想匹配这个字符串中的任何单词。

初始化字符串(emacs tmp 和此技巧的示例)

rx=' ~   #   oo    ^  '

首先,我 trim 这样的字符串:

rx=`printf '%s\n' "$rx" | awk '{=};1'`

==> rx='~ # oo ^'

其次,我使用 Duffy 的 sed 技巧进行了一些更改以适用于我的情况:

rx=`printf '%s\n' "$rx" | sed 's/[[:blank:]]/ /g; s/[^^ ]/[&]/g; s/\^/\^/g'`;

==> rx='[~] [#] [oo] [^]'

第三,我应用一点 awk 命令来制作正则表达式:

rx=`printf '%s\n' "$rx" | awk '{ gsub(" ", "$\|^.*", [=13=]); print "^.*"[=13=]"$" }'`;

==> rx='^.*[~]$\|^.*[#]$\|^.*[o][o]$\|^.*\^$'

最后,我像这样执行查找命令:

find -regex "$rx"

瞧瞧!

顺便说一句,我正在这样做:

rx=`printf '%s\n' "$rx" | awk '{=};1 | sed 's/[[:blank:]]/ /g; s/[^^ ]/[&]/g; s/\^/\^/g' | awk '{ gsub(" ", "$\|^.*", [=15=]);'