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

问题描述 投票:0回答:12

我想在文件中 grep 查找以破折号/连字符开头的字符串,例如

-X
,但它会将其与命令行参数混淆。

我已经尝试过:

grep "-X"
grep \-X
grep '-X'
unix grep escaping
12个回答
656
投票

用途:

grep -- -X

文档

相关:裸露的双破折号是什么意思?(感谢nutty about natty)。


74
投票

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

你明白了。


39
投票

使用 GNU grep,

grep -e -X
就能解决问题。


33
投票
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

8
投票

我无法访问 Solaris 计算机,但

grep "\-X"
在 Linux 上适用于我。


6
投票

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

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

作为旁注 - getopt_long 为我们提供了 -rlo 和 --really_long_option 以及解释器中的参数组合之间的酷选择。


5
投票

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

'[-]X'

2
投票

你可以使用nawk

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

0
投票

所有答案都对我没有帮助(ubuntu 20.04 LTS)。
我找到了另一种选择:

我的案例:

systemctl --help | grep -w -- --user

-w
将匹配整个单词。
--
表示命令参数结束(将
-w
标记为不属于
grep
命令)


0
投票

在 macOS/BSD 上:

grep -e "-X"

就够了。


-1
投票

grep“^-X”文件

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

开头的行

-2
投票
ls -l | grep "^-"

希望这个能满足您的目的。

© www.soinside.com 2019 - 2024. All rights reserved.