Mik*_*ike 320 unix grep escaping
我想grep以字符串开头的短划线连字符,比如-X
在文件中,但是这会让它混淆为命令行参数.
我试过了:
grep "-X"
grep \-X
grep '-X'
Run Code Online (Sandbox Code Playgroud)
new*_*cct 421
使用:
grep -- -X
相关:裸双击是什么意思?(感谢关于natty的坚果).
Cha*_*ing 53
如http://tldp.org/LDP/abs/html/special-chars.html#DASHREF所述,破折号是Bash中的特殊字符.所以逃避这一次只会让你超越Bash,但Grep仍然有它自己的意思破折号(通过提供选项).
所以你真的需要逃避它两次(如果你不想使用其他提到的答案).以下将/应该工作
grep \\-X
grep '\-X'
grep "\-X"
Run Code Online (Sandbox Code Playgroud)
尝试Bash如何将参数传递给脚本/程序的一种方法是创建一个只回显所有参数的.sh脚本.我使用一个名为echo-args.sh的脚本来不时地玩,它包含的是:
echo $*
Run Code Online (Sandbox Code Playgroud)
我把它称为:
bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"
Run Code Online (Sandbox Code Playgroud)
你明白了.
Tho*_*mas 25
grep -e -X
会做的.
Joh*_*nry 18
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
Run Code Online (Sandbox Code Playgroud)
小智 5
正如已经提到的,正确的方法是使用" - "来停止处理参数.这是由于在工具源中使用了getopt_long(来自getopt.h的GNU C函数).
这就是您在其他命令行工具上发现相同现象的原因; 由于它们中的大多数都是GNU工具,并且使用此调用,它们表现出相同的行为.
作为旁注 - getopt_long是让我们在-rlo和--really_long_option之间以及解释器中参数组合之间的很酷选择.