【问题标题】:Bash: escape characters in backticksBash:反引号中的转义字符
【发布时间】:2010-08-13 17:05:11
【问题描述】:

我试图在我的 bash 命令中转义反引号中的字符,主要是为了处理文件名中的空格,这会导致我的命令失败。

我目前的命令是:

grep -Li badword `grep -lr goodword *`

此命令应生成一个不包含单词“badword”但包含“goodword”的文件列表。

【问题讨论】:

  • 这个问题在谷歌的第一页上的“bash escape backtick”,所以它应该回答实际问题(如何在bash中转义反引号字符)。

标签: bash command-line grep backticks


【解决方案1】:

goodword grep 输出的文件数量达到命令行长度限制时,即使您获得了正确的转义,您的方法也会遇到问题。最好将第一个 grep 的输出通过管道传输到第二个 grep,像这样

grep -lr -- goodword * | xargs grep -Li -- badword

这将正确处理其中包含空格的文件,但如果文件名中有换行符,它将失败。至少 GNU grepxargs 支持用 NUL 字节分隔文件名,像这样

grep -lrZ -- goodword * | xargs -0 grep -Li -- badword

编辑:在grep 调用中添加了双破折号grep,以避免某些文件名以- 开头并被grep 解释为附加选项的情况。

【讨论】:

  • 感谢您的提示!我仍然有一些奇怪的行为。当我尝试运行此命令时,我得到以下输出:root@domain [/path]# grep -lrZ goodword * | xargs -0 grep -Li badword grep: invalid option -- k 用法: grep [OPTION]... PATTERN [FILE]... 尝试 `grep --help' 获取更多信息。 (标准输入)
  • @Ian:您的目录中是否有名称以- 开头的文件?在这种情况下,请记住还要在grep 的实际参数之前添加--。我已经相应地修改了答案。
【解决方案2】:

改写成:

grep -lr goodword * | grep -Li badword

【讨论】:

  • 您的建议将输出文件包含goodword且文件名称不包含badword的文件
  • 确实如此;它需要一个 xargs ...感谢您指出这一点 :)
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2023-02-26
  • 2013-11-23
  • 2016-07-08
相关资源
最近更新 更多