Збіг з грепом, коли візерунок містить дефіс "-"


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і дочірніх процесів.
Уве

чи рівна струна - це мій тест
яєль


Інша альтернатива, яку ви не повинні використовувати, щоб ніхто не перелічувався: можливо, уникнути тире всередині цитованого рядка, щоб він розумівся grepяк буквальний символ, а не початок опції, тобто echo test-test | grep "\-test"відповідатиме, а не скаржитися на невідомий -tпрапор.
Аарон

Відповіді:


20

Розмістіть --перед своїм шаблоном:

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

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


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

==не є стандартним для [команди; це башизм . Використовуйте =замість цього.
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.