bash - 当它们来自命令行时,我们如何 egrep 特殊字符?
问题描述
为了清楚起见,我举一个例子。
假设我们想在 bash 脚本中编写一个技术友好的 egrep,这意味着这个人不知道如何逃避特殊字符,他只会传递他想要找到的东西。
例如,当他想在一篇文章中找到它的出现时,他使用
./myEgrep it's myArticle
代替
./myEgrep it\'s myArticle**
我们如何在脚本中处理这个问题?基本上 egrep 不能像人类一样被赋予和理解包含特殊字符的字符串。最困难的部分是如何将 $1 包装在Xgrep $1 $myArticle脚本中。我试过 fgrep 它也行不通。
解决方案
您的问题是单引号是由 shell 或 bash 处理的,它实际上是在停止执行命令,直到用户输入另一个单引号。如果用户用双引号表示了整个短语,那么他们就不需要转义单引号或任何空格,即:
./myEgrep "it's" myArticle
我认为这很容易向用户解释,即使是不太精明的用户。
然后在脚本文件中,您需要再次将参数用双引号括起来:
Xgrep "$1" "$myArticle"
脚本中的最佳实践是几乎总是将参数用双引号括起来,因为它保留了变量内的空格。
当然,这就留下了用户如何从命令行注入双引号的问题。对您来说,简单的答案是让他们使用单引号来包裹双引号,但也许不适合他们;如果他们想混合报价怎么办?
另一种选择是让您处理输入并将空格转换为任何长度的任何空格的正则表达式,并将单引号转换为所有引号的正则表达式,包括 unicode 开/关引号?同样,易于向用户解释。任何其他方案,您都将重新发明转义码。
推荐阅读
- ruby-on-rails - Rails 将 UNIX 时间从 Stripe 创建的时间转换为时间
- regex - 如何选择两个字符(>和<)之间的所有内容,除了MS Word中的字符本身
- c# - NET Framework 4.7.2 应用程序能否在运行时加载 NET Core 5.0 库 DLL?
- javascript - 我只想一次改变“改变”
- c++ - cMake include_directories 但用于包含命令
- c# - Telnet 连接 + 发送输入 + 获取输出
- python - 用python opencv裁剪出字母周围的多个区域
- html - 为什么有些谷歌字体只支持常规样式?
- html - 如何在 HTML 中预加载版本化文件以增强性能?
- java - 创建引用可以在带有 objectify 的事务内引发 ConcurrentModificationException