在 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=]);'
我写了一个小的 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=]);'