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

Posted

技术标签:

【中文标题】如何 grep 以破折号/连字符开头的字符串?【英文标题】:How can I grep for a string that begins with a dash/hyphen? 【发布时间】:2011-01-26 12:59:24 【问题描述】:

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

我试过了:

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

【问题讨论】:

【参考方案1】:

用途:

grep -- -X

相关:What does a bare double dash mean?(感谢nutty about natty)。

【讨论】:

对于我们这些在这个阶段想知道-- 是什么意思或做什么的人:unix.stackexchange.com/questions/11376/… 也适用于 Silver Searcher (ag)。 如果你想使用有空格的变量,你应该使用这样的东西:ARGS="-a -b -c"grep -- "$ARGS" @zapstar 或者只是,grep -- "--name awesome" @BrettWidmeier,是的,我不应该使用这个变量,它会让人们感到困惑。【参考方案2】:

破折号是 Bash 中的一个特殊字符,如 http://tldp.org/LDP/abs/html/special-chars.html#DASHREF 所述。因此,转义一次只会让你越过 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"

你明白了。

【讨论】:

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

grep -e -X 可以解决问题。

【讨论】:

我的grep没有-e,很奇怪 在 /usr/xpg4/bin/grep 的 solaris 上可用,顺便说一句。该目录中有许多更完整的实用程序。 它在 MinGW 下工作(MinGW 不支持 -P(但这是另一个故事,不适用于这里))。 >What if a pattern has a leading ‘-’? grep -e '--cut here--' * searches for all lines matching ‘--cut here--’. Without -e, grep would attempt to parse ‘--cut here--’ as a list of options.【参考方案4】:
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

【讨论】:

【参考方案5】:

我无法访问 Solaris 机器,但 grep "\-X" 在 linux 上为我工作。

【讨论】:

【参考方案6】:

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

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

附带说明 - getopt_long 让我们在 -rlo 和 --really_long_option 以及解释器中的参数组合之间做出了很酷的选择。

【讨论】:

【参考方案7】:

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

'[-]X'

【讨论】:

【参考方案8】:

你可以使用 nawk

$ nawk '/-X/print' file

【讨论】:

【参考方案9】:
ls -l | grep "^-"

希望这个能达到你的目的。

【讨论】:

此表达式仅捕获以破折号开头的行。它不符合最初的问题。他想搜索以破折号开头的字符串,但包含该字符串的行不必以破折号开头。在最初的问题中,以破折号开头的字符串可以在该行中的任何位置。【参考方案10】:

grep "^-X" 文件

它将 grep 并选择文件中的所有行。 grep中的^“^”表示以

开头的行

【讨论】:

已经有答案提示***.com/a/27440348/441757(一年多前发布) OP 正在寻找以- 开头的字符串,而不是行。

以上是关于如何 grep 以破折号/连字符开头的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Grep命令 - 列表文件以字符串和扩展名开头

grep匹配字符串

VBA:从数组中创建选定的字符串

为啥 ---(3 个破折号/连字符)在 yaml 文件中?

正则表达式去除给定字符以外的字符?

Linux shell提取字符串,文件中以a开头以z结尾的所有字符串