【问题标题】:How to search for pattern containing brackets and other special characters in shell如何在shell中搜索包含括号和其他特殊字符的模式
【发布时间】:2015-06-27 22:34:54
【问题描述】:

我正在尝试在“output2”文件中进行以下模式搜索,但即使 grep 命令的状态显示成功,它也没有给出所需的输出。

➜  automate git:(master) ✗ grep -F "@PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")" output2
➜  automate git:(master) ✗ grep -nF "@PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")" output2
➜  automate git:(master) ✗ echo $?
0
➜  automate git:(master) ✗ 

下面的 output2 文件的内容:

/home/workspace/OutputWithMessages.txt:1549:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:3254:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:4558:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:5438:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:5744:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:6986:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:7344:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus,

【问题讨论】:

  • 尝试用单引号代替字符串引用?

标签: bash shell unix scripting grep


【解决方案1】:

字符串需要正确引用:

$ grep -F '@PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, '\''MAX_LOAN_AMOUNT_FOR_APPROVE'\'')")' output2
/home/workspace/OutputWithMessages.txt:1549:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:3254:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:4558:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:5438:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:5744:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")
/home/workspace/OutputWithMessages.txt:6986:+ @PreAuthorize("isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')")

shell 将单引号字符串中的所有字符视为单引号的文字字符除了。要输入单引号作为字符串的一部分,请使用'\''

'\'' 分三个步骤工作:首先它用' 终止单引号字符串,然后它用\' 添加一个转义的单引号,最后它用' 开始一个新的单引号字符串.

【讨论】:

  • grep 不需要使用反斜杠作为单引号
  • @Zack 你说得对,grep 不需要它,但这就是 not 存在的原因:需要反斜杠,以便 shell 将单引号视为一个文字字符,因此将其传递给 grep。
  • 是的。您正确使用反斜杠是正确的。但对于我的问题,它不是必需的。 :) 不使用带双引号的反斜杠,它不起作用。
  • @Zack 您的解决方案在这种情况下确实有效,但需要注意:shell 将对双引号字符串进行变量、命令和算术扩展。如果你想确保你的字符串是按字面意思理解的,单引号更安全。
【解决方案2】:

我把“换成\”,问题就解决了。

grep -F "@PreAuthorize(\"isFullyAuthenticated() and hasPermission(#updateStatus, 'MAX_LOAN_AMOUNT_FOR_APPROVE')\")" output2

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多