Сопоставлять с grep, если шаблон содержит дефис «-»

11

Я написал следующую команду, чтобы сопоставить $ a с $ b, но когда значение включает «-», я получаю сообщение об ошибке. Как я могу избежать этого?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
Яэль
источник
3
Подумайте об изменении вашей команды, чтобы grep -Fxc -- "$b" <<< "$a"избежать ненужного канала
h3rrmiller
8
Кстати, вы действительно хотите совпадение с регулярным выражением или просто хотите проверить, равна ли строка (или является подстрокой) другой строке? В этом случае оболочка встроенных модулей [[ ... ]]или caseбудет лучшим выбором, так как вы избегаете оба идиосинкразии echoи дочерних процессов.
Уве
равна ли строка, это мой тест
yael
Еще одна альтернатива, которую вы не должны использовать, но в которой никто не указан: возможно избежать тире внутри строки в кавычках, так что она понимается grepкак буквальный символ, а не как начало опции, т.е. echo test-test | grep "\-test"будет соответствовать, а не жаловаться на неизвестный -tфлаг.
Аарон

Ответы:

20

Поместите --перед вашим шаблоном:

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

-- задает параметры конца команды для многих встроенных команд / оболочек, после чего оставшиеся аргументы обрабатываются как позиционные аргументы.

sebasth
источник
13

Помимо отличного ответа @ sebasth , вы могли бы сказать, что PATTERN с grep's -e опцией использовать PATTERN в качестве шаблона (здесь используется <<< zshоператор here-string вместо echo; смотрите также printf '%s\n' "$a"для переносимости).

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

Или все, кроме других вариантов.

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

Поскольку ваша цель - сравнение равенства строк между байтами, используйте [команду.

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

Или, если $aсодержит $b, используя [[...]]конструкцию ksh:

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

Или, более переносимо, во всех оболочках типа Борна:

case $a in
  *"$b"*) ...
esac
αғsнιη
источник
==не является стандартным для [команды; это башизм . Используйте =вместо этого.
Wildcard