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

时间:2010-03-11 19:14:43

标签: unix grep escaping

我想在一个文件中grep查找以短划线/连字符开头的字符串,如-X,但是这会将其作为命令行参数混淆。

我试过了:

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

10 个答案:

答案 0 :(得分:376)

使用:

grep -- -X

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

答案 1 :(得分:48)

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"

你明白了。

答案 2 :(得分:24)

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

答案 3 :(得分:16)

grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X

答案 4 :(得分:7)

我无法访问Solaris计算机,但grep "\-X"可以在Linux上运行。

答案 5 :(得分:5)

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

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

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

答案 6 :(得分:3)

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

'[-]X'

答案 7 :(得分:2)

你可以使用nawk

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

答案 8 :(得分:-1)

ls -l | grep "^-"

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

答案 9 :(得分:-1)

grep" ^ - X"文件

它将grep并从文件中选择所有行。 ^在grep" ^"表示以

开头的行