не удается передать параметры в grep из оболочки

#macos #grep #zsh

#macos #grep #zsh

Вопрос:

Я пытаюсь запустить сложную команду grep из оболочки (в настоящее время zsh на macOS, но bash будет в порядке)

Я хочу передать переменные, то есть $ 1 и $ 2, в команду: grep -e ‘something $ 1’ -e ‘somethingelse $ 2’ файл

Например, мой скрипт:

 #/bin/zsh
echo ------
echo grep -e "'"something $1"'" -e "'"somethingelse $2"'" file
echo ------
grep -e "'"something $1"'" -e "'"somethingelse $2"'" file
 

Это не работает с:

 % ~/scripts/test cat mouse
------
grep -e 'something cat' -e 'somethingelse mouse' file
------
grep: cat': No such file or directory
grep: mouse': No such file or directory
 

Есть идеи?

Комментарии:

1. I am trying to run a complex grep command — никогда ничего хорошего не начинаешь :-)! Вы пытаетесь использовать grep для регулярного выражения или строки? Вы хотите выполнить частичное или полное сопоставление строк?

2. @EdMorton: в соответствии с используемыми параметрами, OP, похоже, хочет использовать простое регулярное выражение.

3. @user1934428 часто существует большая разница между тем, что делает OP, и тем, что они хотят делать.

Ответ №1:

Не пытайтесь добавлять одинарные кавычки при выполнении команды; просто заключите шаблон в двойные кавычки (включая параметр).:

 #/bin/zsh
echo ------
echo grep -e "'something $1'" -e "'somethingelse $2'" file
echo ------
grep -e "something $1" -e "somethingelse $2" file
 

Обратите внимание, что при echo редактировании я использовал одинарные кавычки внутри двойных кавычек. Они будут напечатаны, так что это будет выглядеть нормально, но оболочка не будет рассматривать их как синтаксически значимые. Когда вы на самом деле работаете grep , вам вообще не нужны одинарные кавычки.

Ну, если something только не содержит экранирования или знаки доллара; в этом случае вы можете либо экранировать их:

 grep -e "$ometh\ng $1" -e "$ometh\nge\se $2" file
 

Или смешайте одинарные и двойные кавычки, с одинарными кавычками вокруг фиксированной части шаблона и двойными кавычками только вокруг части параметра:

 grep -e '$omethng '"$1" -e '$omethngese '"$2" file
 

Ответ №2:

Я не знаю, почему вы хотите grep видеть свои цитаты. Предполагая, что ваша литеральная строка something не содержит пробелов или других символов, которые важны для оболочки (наиболее заметные подстановочные знаки расширения имени файла), и вы используете zsh,

 grep something$1 FILE
 

будет работать. Конечно, если у вас есть пробелы внутри или вокруг вашего чего-либо, вам нужно заключить его в кавычки:

 grep 'something '$1 FILE # Significant space between something and $1
 

или

 grep "something $1" FILE
 

Поскольку вы также упомянули bash: в bash имеет смысл только последняя форма (с использованием двойных кавычек), потому что, если бы $ 1 содержал пробелы, bash выполнял бы разделение слов.