Bash grep 不适用于撇号

Posted

技术标签:

【中文标题】Bash grep 不适用于撇号【英文标题】:Bash grep is not working with apostrophe 【发布时间】:2014-07-30 11:04:03 【问题描述】:

我已尝试运行此代码:

lsof | grep "/file/path/"

如果文件有这个标志:

`

我收到一个错误:

syntax error near unexpected token '`'

我尝试用\ 转义这个标志,但我得到了同样的错误。

操作系统:CentOS 6

【问题讨论】:

我没有看到任何可能导致意外错误的代码部分。你确定那是你唯一运行的东西吗?如果你只运行lsof,你会得到什么? 什么文件?您将一个命令的标准输出传递给另一个命令的标准输入。 如果你的意思是你想要 grep 的文件中包含该字符,那么在 grep 的参数中转义它应该可以工作,但如果由于某些奇怪的原因它不能,你也可以尝试使用单引号围绕参数而不是双引号。但请提供导致问题的确切命令。 “如果文件有这个符号'”是什么意思?如果 ' 是 lsof 输出的一部分,那不可能是见证 echo "ab'cd" | grep "b" -- 也回显 "ab'cd" | grep "'c" 的行为符合预期 【参考方案1】:

` 字符(通常称为“反引号”)由 shell 专门解释,即使被引号包围

具体来说,`cmd args` 的意思是“执行命令 cmd args 并将反引号字符串替换为该命令的输出。”如果它被引号包围——"`cmd args`"——被替换的字符串将不会进行分词或路径名扩展。 (这通常是你想要的,所以引用的反引号很常见。)

该语法已被弃用很长时间,但仍被接受。新代码应改用$(cmd args)。如上所述,您通常希望避免对替换文本进行分词和路径名扩展,因此您通常会看到"$(cmd args)"

简而言之,如果您想将文字反引号放入参数字符串中,您应该使用单引号:

lsof | grep '/file/path`s/'

\ - 转义反引号:

lsof | grep "/file/path\`s/"

【讨论】:

以上是关于Bash grep 不适用于撇号的主要内容,如果未能解决你的问题,请参考以下文章

Sendmail 不适用于 crontab (bash)

bash中双引号单引号反撇号的用法

wp-cli 适用于 windows cmd,但不适用于 Gitbash

bash行,用于简单统计SSH中断尝试

bash:通过grep匹配单引号和双引号

使用grep搜索BASH历史记录