在shell脚本中使用egrep时转义单引号

时间:2012-10-29 16:48:23

标签: bash shell sh

我需要在给定的输入字符串中找到一些特殊字符。 如果字符串包含以下特殊字符,则应该找出。 我正在做egrep寻找角色。 我的代码适用于每个字符,但不适用于单引号。 请找到我的代码段。

splCharCheck='egrep "&|\"|:|\'" | wc -l'

count=`echo  "$Name" | eval $splCharCheck`

任何人都可以帮我解决单引号的问题吗?

3 个答案:

答案 0 :(得分:0)

不要“逃避”单引号。检查以下内容:

# cat test
'name with quotes'
no quotes

# cat test | egrep "'"
'name with quotes'

# cat test | egrep "\'"
'name with quotes'
no quotes

答案 1 :(得分:0)

你想要达到什么目的?这有点像XY问题。

在bash中,您可以使用

轻松转义文本
printf "%q\n" "$Name"

E.g:

$ Name="Some 'intricate' value"
$ printf "%q\n" "$Name"
Some\ \'intricate\'\ value

答案 2 :(得分:0)

您正试图在双引号字符串中嵌入单引号,该字符串位于单引号字符串中。问题是在单引号字符串中,双引号不被视为任何特殊的引号,因此中间的单引号被视为单引号字符串的结尾而不是它的一部分。为此,您需要结束单引号字符串('egrep "&|\"|:|'),以其他方式转义单引号(\'"'"),然后启动新的单引号字符串,包含您想要的其余内容('" | wc -l')。最终结果:

splCharCheck='egrep "&|\"|:|'\''" | wc -l'

但是,我必须同意@sehe,看起来你正试图解决错误的问题。为什么要将此命令放在变量中而不是直接执行?这是generally a bad idea(和eval只会增加更多机会让事情变得奇怪)。而且,进一步备份,你真正想做什么?

P.S。如果你必须使用eval,至少要双重引用你正在评估的字符串。如果不这样做可能会导致一些严重难以理解的错误。最后,我建议使用$( )而不是反引号,因为它解析奇怪的次数较少:

count=$(echo  "$Name" | eval "$splCharCheck")