首页 > 解决方案 > 当它们来自命令行时,我们如何 egrep 特殊字符?

问题描述

为了清楚起见,我举一个例子。

假设我们想在 bash 脚本中编写一个技术友好的 egrep,这意味着这个人不知道如何逃避特殊字符,他只会传递他想要找到的东西。

例如,当他想在一篇文章中找到它的出现时,他使用

./myEgrep it's myArticle

代替

./myEgrep it\'s myArticle**

我们如何在脚本中处理这个问题?基本上 egrep 不能像人类一样被赋予和理解包含特殊字符的字符串。最困难的部分是如何将 $1 包装Xgrep $1 $myArticle脚本中。我试过 fgrep 它也行不通。

标签: bashgrep

解决方案


您的问题是单引号是由 shell 或 bash 处理的,它实际上是在停止执行命令,直到用户输入另一个单引号。如果用户用双引号表示了整个短语,那么他们就不需要转义单引号或任何空格,即:

./myEgrep "it's" myArticle

我认为这很容易向用户解释,即使是不太精明的用户。

然后在脚本文件中,您需要再次将参数用双引号括起来:

Xgrep "$1" "$myArticle"

脚本中的最佳实践是几乎总是将参数用双引号括起来,因为它保留了变量内的空格。

当然,这就留下了用户如何从命令行注入双引号的问题。对您来说,简单的答案是让他们使用单引号来包裹双引号,但也许不适合他们;如果他们想混合报价怎么办?

另一种选择是让您处理输入并将空格转换为任何长度的任何空格的正则表达式,并将单引号转换为所有引号的正则表达式,包括 unicode 开/关引号?同样,易于向用户解释。任何其他方案,您都将重新发明转义码。


推荐阅读