如何对以破折号/连字符开头的字符串进行grep?


347

我想在文件中grep输入以破折号/连字符开头的字符串,例如-X,但这将其作为命令行参数混淆了。

我试过了:

grep "-X"
grep \-X
grep '-X'

Answers:


465

采用:

grep -- -X

相关:裸双破折号是什么意思?(感谢有关natty的坚果)。


57
对于我们这些想知道现阶段--意味着什么或做什么的人:unix.stackexchange.com/questions/11376/…–含糊不清的
内容

2
也可以与Silver Searcher(ag)一起使用。
Zev Eisenberg

如果要与具有空格的变量一起使用,则应使用以下ARGS="-a -b -c" grep -- "$ARGS"
格式

2
@zapstar还是grep -- "--name awesome"
Brett Widmeier 2015年

@BrettWidmeier,是的,我不应该使用该变量,它会使人们感到困惑。
zapstar

57

http://tldp.org/LDP/abs/html/special-chars.html#DASHREF所述,破折号是Bash中的特殊字符。。因此,一次转义就可以使您摆脱Bash的困扰,但是Grep仍然具有破折号的含义(通过提供选项)。

因此,您确实需要对其进行两次转义(如果您不想使用其他提到的答案)。以下将/应该工作

grep \\-X
grep '\-X'
grep "\-X"

尝试Bash如何将参数传递给脚本/程序的一种方法是创建一个仅回显所有参数的.sh脚本。我不时使用名为echo-args.sh的脚本进行播放,它包含的所有内容是:

echo $*

我将其调用为:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

你明白了。


1
我不认为-尽管ABS指南说了什么,但Bash还是一个特殊角色。Bash不会处理以-开头的参数-与其他参数不同。Bash随后调用的命令或内置命令将处理以破折号开头的参数,但它认为合适。大多数Bash内置程序以及Linux和GNU命令都可以处理-作为选项终止符。使用'set -x'可以查看Bash在执行之前,但在Bash扩展了转义符,glob和花括号之后使用的命令和参数。Grep是一个令人困惑的示例,因为它自己处理反斜杠转义符。
Noah Spurrier

25

grep -e -X 会成功的


1
我的grep没有-e,很奇怪
Mike

14
solaris的输家
Mike

2
可从/ usr / xpg4 / bin / grep,btw在solaris上获得。该目录中有许多更完整的实用程序。
PRA

它在MinGW下工作(MinGW不支持-P(但这是另一个故事,在这里不适用))。
Peter Mortensen



7

我没有访问Solaris机器的权限,但是grep "\-X"可以在linux上使用。


5

如前所述,正确的方法是使用“-”停止处理参数。这是由于在该工具的源代码中使用了getopt_long(来自getopt.h的GNU C函数)。

这就是为什么您在其他命令行工具上注意到相同现象的原因。由于大多数都是GNU工具,并且使用此调用,因此它们表现出相同的行为。

附带说明-getopt_long是让我们在-rlo和--really_long_option之间以及在解释器中的参数组合之间进行酷炫选择的原因。


3

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

'[-]X'


-1
ls -l | grep "^-"

希望这个可以为您服务。


2
该表达式仅捕获以破折号开头的行。它不符合最初的问题。他想搜索以破折号开头的字符串,但是包含该字符串的行不必以破折号开头。在最初的问题中,以破折号开头的字符串可以在行中的任何位置。
洛朗·西蒙

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.