Combine com grep quando o padrão contiver hífen "-"

11

Eu escrevi o seguinte comando para combinar $ a com $ b, mas quando o valor inclui "-", recebo um erro. Como posso evitar isso?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
yael
fonte
3
Considere alterar o seu comando para grep -Fxc -- "$b" <<< "$a"evitar o tubo desnecessário
h3rrmiller
8
A propósito, você realmente deseja uma correspondência de regex ou apenas deseja testar se uma string é igual a (ou é uma substring de) outra string? Nesse caso, o shell é incorporado [[ ... ]]ou caseseria uma escolha melhor, pois você evita as idiossincrasias echoe os processos filhos.
Uwe
se uma string é igual este é o meu teste
yael
Outra alternativa que você não deve usar é que ninguém listado: é possível escapar do traço dentro de uma sequência de caracteres citada, para que seja entendido grepcomo um caractere literal, e não o início de uma opção, ou seja echo test-test | grep "\-test", corresponderá ao invés de reclamar de um -tsinalizador desconhecido .
Aaron

Respostas:

20

Coloque --antes do seu padrão:

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

-- especifica opções de final de comando para muitos comandos / shell internos, após o qual os argumentos restantes são tratados como argumentos posicionais.

sebasth
fonte
13

Além da ótima resposta do @ sebasth , você poderia dizer ao PATTERN com a grep's -e opção de usar o PATTERN como padrão (aqui, usando o <<< zshoperador aqui-string em vez de echo; veja também printf '%s\n' "$a"a portabilidade).

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

Ou tudo ao lado de outras opções.

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

Como seu objetivo é a comparação de igualdade de cadeias de bytes a bytes, use o [comando.

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

Ou se $acontém $b, usando a [[...]]construção ksh:

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

Ou mais portatilmente em todas as conchas do tipo Bourne:

case $a in
  *"$b"*) ...
esac
αғsнιη
fonte
==não é padrão para o [comando; é um basismo . Use em =vez disso.
Wildcard