我怎样才能找到以短划线/连字符开头的字符串?

Mik*_*ike 320 unix grep escaping

我想grep以字符串开头的短划线连字符,比如-X在文件中,但是这会让它混淆为命令行参数.

我试过了:

grep "-X"
grep \-X
grep '-X'
Run Code Online (Sandbox Code Playgroud)

new*_*cct 421

使用:

grep -- -X

相关:裸双击是什么意思?(感谢关于natty的坚果).

  • 对于我们这些在这个阶段想知道` - `意味着什么或做什么的人:http://unix.stackexchange.com/questions/11376/what-does-double-dash-mean (53认同)
  • 对于许多Unix实用程序来说,` - `是一个方便的技巧. (31认同)
  • 与`ack`一起使用 (2认同)
  • 与Silver Searcher(ag)合作. (2认同)
  • @zapstar还是grep-“ --name awesome”。 (2认同)

Cha*_*ing 53

http://tldp.org/LDP/abs/html/special-chars.html#DASHREF所述,破折号是Bash中的特殊字符.所以逃避这一次只会让你超越Bash,但Grep仍然有它自己的意思破折号(通过提供选项).

所以你真的需要逃避它两次(如果你不想使用其他提到的答案).以下将/应该工作

grep \\-X
grep '\-X'
grep "\-X"
Run Code Online (Sandbox Code Playgroud)

尝试Bash如何将参数传递给脚本/程序的一种方法是创建一个只回显所有参数的.sh脚本.我使用一个名为echo-args.sh的脚本来不时地玩,它包含的是:

echo $*
Run Code Online (Sandbox Code Playgroud)

我把它称为:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Run Code Online (Sandbox Code Playgroud)

你明白了.

  • 我不认为 - 是 Bash 中的一个特殊字符,尽管 ABS 指南是这么说的。Bash 处理以 - 开头的参数与其他参数没有任何不同。Bash 随后调用的命令或内置命令将处理以破折号开头的参数,但它认为合适。大多数 Bash 内置命令以及 Linux 和 GNU 命令都将 -- 作为选项终止符。使用“set -x”查看 Bash 在执行之前、Bash 扩展转义符、通配符和大括号之后使用的命令和参数。Grep 是一个令人困惑的示例,因为它自己处理反斜杠转义。 (2认同)

Tho*_*mas 25

grep -e -X 会做的.

  • solaris为输 (14认同)
  • 可从/ usr / xpg4 / bin / grep,btw在solaris上获得。该目录中有许多更完整的实用程序。 (2认同)

Joh*_*nry 18

grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Run Code Online (Sandbox Code Playgroud)


ezp*_*zpz 7

我没有访问Solaris机器,但grep "\-X"在linux上适用于我.


小智 5

正如已经提到的,正确的方法是使用" - "来停止处理参数.这是由于在工具源中使用了getopt_long(来自getopt.h的GNU C函数).

这就是您在其他命令行工具上发现相同现象的原因; 由于它们中的大多数都是GNU工具,并且使用此调用,它们表现出相同的行为.

作为旁注 - getopt_long是让我们在-rlo和--really_long_option之间以及解释器中参数组合之间的很酷选择.


Col*_* vH 5

如果您使用另一个将单个参数传递给 grep 的实用程序,您可以使用:

'[-]X'
Run Code Online (Sandbox Code Playgroud)