【问题标题】:Escaping the exclamation point in grep?转义grep中的感叹号?
【发布时间】:2026-01-12 23:55:03
【问题描述】:

我有整行(下面的 awk 中的 rpm 命令)我想从某些文件中提取出来,包括引号。当我尝试 grep 和 grep -F 时,我似乎无法获得正确的输出。我尝试从 grep 语句中删除部分行尾,它看起来像“!”导致问题。我尝试将字符串用单引号括起来,但也没有运气。谢谢你。

rpm -qVa | awk '$2!="c" {print $0}'

【问题讨论】:

  • 完整添加 grep 行的示例可能会有所帮助。我想它是这样的:grep "rpm -qVa | awk '$2!="c" {print $0}"
  • 如果您收到“未找到事件”,请关闭 Bash 中的 histexpand 选项。不过,IIRC 单引号应该防止这种情况发生。

标签: linux bash grep


【解决方案1】:

你有几个选择。

  1. 使用单引号 - 当您需要文字单引号时,只需去掉单引号,用反斜杠添加一个,然后返回:

    grep 'rpm -qVa | awk '\''$2!="c" {print $0}'\' filename

  2. 使用 POSIX 字符串:

    grep $'rpm -qVA | awk \'$2!="c" {print $0}\'' filename

  3. 使用不太具体的模式:

    grep 'rpm -qvA | awk .$2.="c" {print $0}.' filename

    或者,如果您检查了$2=="c"$2!="c",您可以执行以下操作:

    grep 'rpm -qvA | awk .$2[^=]="c" {print $0}.' filename

我会使用 POSIX 字符串,或者可能是普通的单引号选项 - 它具有在其他 shell 中工作的有争议的优势,例如 dash

【讨论】:

    【解决方案2】:

    反斜杠应该可以解决问题

    rpm -qVa | awk '\$2!="c" {print $0}'
    

    【讨论】: