我想在文件中 grep 查找以破折号/连字符开头的字符串,例如
-X
,但它会将其与命令行参数混淆。
我已经尝试过:
grep "-X"
grep \-X
grep '-X'
破折号是 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"
你明白了。
使用 GNU grep,
grep -e -X
就能解决问题。
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
我无法访问 Solaris 计算机,但
grep "\-X"
在 Linux 上适用于我。
正确的方法是使用“--”来停止处理参数,正如已经提到的。这是由于在工具源代码中使用了 getopt_long(来自 getopt.h 的 GNU C 函数)。
这就是为什么您在其他命令行工具上注意到相同的现象;因为它们大多数都是 GNU 工具,并且使用这个调用,所以它们表现出相同的行为。
作为旁注 - getopt_long 为我们提供了 -rlo 和 --really_long_option 以及解释器中的参数组合之间的酷选择。
如果您使用另一个将单个参数传递给 grep 的实用程序,您可以使用:
'[-]X'
你可以使用nawk
$ nawk '/-X/{print}' file
所有答案都对我没有帮助(ubuntu 20.04 LTS)。
我找到了另一种选择:
我的案例:
systemctl --help | grep -w -- --user
-w
将匹配整个单词。--
表示命令参数结束(将 -w
标记为不属于 grep
命令)
在 macOS/BSD 上:
grep -e "-X"
就够了。
grep“^-X”文件
它将 grep 并选取文件中的所有行。 grep中的^“^”表示以
开头的行ls -l | grep "^-"
希望这个能满足您的目的。