模式包含连字符“-”时与grep匹配


11

为了使$ a与$ b匹配,我编写了以下命令,但是当值包含“-”时,我得到一个错误。我该如何避免呢?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified

3
考虑更改您的命令以grep -Fxc -- "$b" <<< "$a"避免不必要的管道
h3rrmiller

8
顺便说一句,您是否真的要进行正则表达式匹配,还是只想测试一个字符串是否等于另一个字符串(或该字符串的子字符串)?在那种情况下,shell内置[[ ... ]]case将是一个更好的选择,因为您既避免了的特殊性echo又避免了子进程。
Uwe

字符串是否相等,这是我的测试
yael


另一个您不应该使用没有列出的人的替代方法:可以将带引号的破折号转义,因此可以将其理解grep为文字字符而不是选项的开始,即echo test-test | grep "\-test"匹配而不是抱怨未知-t标志。
亚伦

Answers:


20

请将--您的模式之前:

echo "$a"  | grep -Fxc -- "$b"

-- 指定许多命令/ shell内置命令的命令选项结尾,之后将其余参数视为位置参数。


13

除了@sebasth的好答案之外,您还可以告诉PATTERN带有grep's -e 将PATTERN用作模式的选项(这里使用<<< zshhere-string运算符代替echoprintf '%s\n' "$a"有关可移植性,另请参见)。

grep -Fxc -e "$b" <<<"$a"

或所有其他选项。

grep -Fxce "$b" <<<"$a"

由于您的目标是字节对字符串的相等性比较,因此请使用[命令。

if [ "$a" = "$b" ]

或者,如果$a包含$b,则使用[[...]]ksh构造:

if [[ $a == *"$b"* ]]

或更可移植到所有类似Bourne的外壳中:

case $a in
  *"$b"*) ...
esac

==[命令不是标准的;这是一种bashism。使用=代替。
通配符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.