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

Unix 如何对以破折号/连字符开头的字符串进行grep?,unix,grep,escaping,Unix,Grep,Escaping,我想在文件中搜索以破折号/连字符开头的字符串,如-X,但这会将其混淆为命令行参数 我试过: grep "-X" grep \-X grep '-X' grep-e-X就可以了。使用: grep--X 相关:(感谢)。我没有访问Solaris机器的权限,但是grep“\-X”在linux上对我有效。你可以使用nawk $ nawk '/-X/{print}' file 破折号是Bash中的一个特殊字符,如中所述。所以,跳过这一步只会让您通过Bash,但Grep仍然有破折号的含义(通过提供选项)

我想在文件中搜索以破折号/连字符开头的字符串,如
-X
,但这会将其混淆为命令行参数

我试过:

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

grep-e-X
就可以了。

使用:

grep--X


相关:(感谢)。

我没有访问Solaris机器的权限,但是
grep“\-X”
在linux上对我有效。

你可以使用nawk

$ nawk '/-X/{print}' file

破折号是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"

您明白了。

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

这就是为什么您会在其他命令行工具上注意到相同的现象;因为它们大多数是GNU工具,并且使用这个调用,所以它们表现出相同的行为


作为旁注,-getopt_long让我们在-rlo和--really_long_选项以及解释器中的参数组合之间做出了很酷的选择。

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

'[-]X'
希望这一个能满足您的需要。

grep“^-X”文件

它将grep并拾取文件中的所有行。
^在grep中,“^”表示一行以

开头,我的grep没有-e,在solaris上从/usr/xpg4/bin/grep,顺便说一句。该目录中有许多更完整的实用程序。它在MinGW下工作(不支持
-p
(但这是另一个故事,不适用于此处)).>对于我们这些在这个阶段想知道
--
意味着什么或做什么的人来说:也适用于Silver Searcher(ag)。如果你想使用带有空格的变量,你应该使用这样的东西:
ARGS=“-a-b-c”
grep--“$ARGS”
@zapstar或者只是,
grep--“name”
@BrettWidmeier,是的,我不应该使用这个变量,它会让人困惑。已经有一个答案表明(一年多前发布)OP查找的是以
-
开头的字符串,而不是行。这个表达式只捕捉以破折号开头的行。它不符合最初的问题。他想搜索以破折号开头的字符串,但包含该字符串的行不必以破折号开头。在最初的问题中,以破折号开头的字符串可以位于行中的任何位置。我不认为-是Bash中的特殊字符,不管ABS指南怎么说。Bash不会处理以开头的参数-与其他参数没有任何不同。Bash随后调用的命令或内置函数将处理以破折号开头的参数,但它认为合适。大多数Bash内置命令以及Linux和GNU命令作为选项终止符进行处理。使用“set-x”查看Bash在执行命令和参数之前使用的命令和参数,但在Bash扩展了转义符、全局符和大括号之后使用。Grep是一个令人困惑的例子,因为它自己处理反斜杠转义。
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
ls -l | grep "^-"