我需要在给定的输入字符串中查找一些特殊字符。如果字符串包含以下特殊字符,它应该找出。我正在做egrep来寻找角色。我的代码适用于每个字符,但不适用于单引号。请找到我的代码片段。
splCharCheck='egrep "&|\"|:|\'" | wc -l'
count=`echo "$Name" | eval $splCharCheck`
有人能帮我转义这里的单引号吗?
发布于 2012-10-30 00:54:46
不要“转义”单引号。请查看以下内容:
# cat test
'name with quotes'
no quotes
# cat test | egrep "'"
'name with quotes'
# cat test | egrep "\'"
'name with quotes'
no quotes
发布于 2012-10-30 01:41:20
你想要达到什么目的?这闻起来像是XY问题。
在bash中,您可以使用以下命令轻松转义文本
printf "%q\n" "$Name"
例如:
$ Name="Some 'intricate' value"
$ printf "%q\n" "$Name"
Some\ \'intricate\'\ value
发布于 2012-10-30 08:34:22
您正在尝试将单引号嵌入到双引号字符串中,而双引号字符串则位于单引号字符串中。问题是,在单引号字符串中,双引号没有被视为任何特殊的东西,因此中间的单引号被视为单引号字符串的末尾,而不是它的一部分。为此,您需要结束单引号字符串('egrep "&|\"|:|'
),以其他方式转义单引号( \'
或"'"
),然后用您想要的其余部分('" | wc -l'
)开始一个新的单引号字符串。最终结果:
splCharCheck='egrep "&|\"|:|'\''" | wc -l'
然而,我不得不同意@sehe的观点,看起来你似乎是在试图解决错误的问题。为什么要把这个命令放在一个变量中,而不是直接执行它?这就是generally a bad idea ( eval
只是增加了更多让事情变得奇怪的机会)。再往后看,你真正想做的是什么?
附注:如果你必须使用eval
,至少要用双引号将你求值的字符串引起来。如果不这样做,可能会导致一些严重的无法理解的错误。最后,我建议使用$( )
而不是反引号,因为它的解析奇特之处较少:
count=$(echo "$Name" | eval "$splCharCheck")
https://stackoverflow.com/questions/13126063
复制相似问题