我需要在给定的输入字符串中找到一些特殊字符。如果字符串包含以下特殊字符,它应该找出来。我正在做 egrep 来寻找角色。我的代码适用于每个字符,但不适用于单引号。请找到我的代码片段。
splCharCheck='egrep "&|\"|:|\'" | wc -l'
count=`echo "$Name" | eval $splCharCheck`
谁能帮我在这里转义单引号?
你想达到什么目的?这闻起来像 XY 问题。
在 bash 中,您可以轻松地使用转义文本
printf "%q\n" "$Name"
例如:
$ Name="Some 'intricate' value"
$ printf "%q\n" "$Name"
Some\ \'intricate\'\ value
您正在尝试将单引号嵌入到双引号字符串中,该字符串位于单引号字符串中。问题是在单引号字符串中,双引号不被视为任何特殊内容,因此中间的单引号被视为单引号字符串的结尾而不是它的一部分。为此,您需要结束单引号字符串 ( 'egrep "&|\"|:|'
),以其他方式(或\'
或"'"
)转义单独的单引号,然后使用您想要的其余部分 ( ) 开始一个新的单引号字符串'" | wc -l'
。最终结果:
splCharCheck='egrep "&|\"|:|'\''" | wc -l'
但是,我必须同意@sehe 的观点,您似乎正在尝试解决错误的问题。你为什么把这个命令放在一个变量中而不是直接执行它?这通常是一个坏主意(eval
只会增加更多让事情变得奇怪的机会)。而且,进一步备份,您真正想要做什么?
ps 如果你必须使用eval
,至少双引号你正在评估的字符串。不这样做可能会导致一些严重难以理解的错误。最后,我建议使用$( )
而不是反引号,因为它的解析异常更少:
count=$(echo "$Name" | eval "$splCharCheck")
不要“逃避”单引号。检查以下:
# cat test
'name with quotes'
no quotes
# cat test | egrep "'"
'name with quotes'
# cat test | egrep "\'"
'name with quotes'
no quotes