сходство между двумя файлами с помощью grep, почему это работает: grep -i "-ffile1" file2 - PullRequest
0 голосов
/ 23 января 2020

У меня есть два файла, file1 и file2, и я хочу найти сходство между этими двумя файлами, используя grep.

почему -f должен передаваться по имени файла без пробелов, когда я окружаю -f file1 с помощью кавычки?

это будет работать

grep -i "-ffile1" file2

, но это не будет работать

grep -i "-f file1" file2

но если я удалю кавычки, эти два случая будут работать

grep -i -ffile1 file2
grep -i -f file1 file2

Ответы [ 2 ]

2 голосов
/ 23 января 2020

По соглашению, однобуквенные опции с аргументами могут быть представлены как два аргумента, то есть либо

(1)

  • N-й параметр для grep: -f
  • (N + 1) -ый параметр для grep: имя файла.

или

(2)

как отдельный параметр, где имя сразу следует за буквой опции: -ffilename

Во второй попытке "-f xxxx" вы передаете один параметр (который соответствует случаю (2)), но сразу следует после буквы опции - пробел. Следовательно, вы указываете имя файла, начиная с пробела. Такой файл не существует. Следовательно, в этом случае вы видите другое поведение.

1 голос
/ 23 января 2020

Опцию -f можно использовать двумя способами: либо указав имя файла в следующем аргументе, либо указав имя файла в том же аргументе сразу после -f.

Когда вы кавычка аргумента как "-f file1", второй случай запускается и grep ищет файл с именем " file1" с начальным пробелом. Поскольку ваш файл называется "file1", без начального пробела, grep не может его найти.

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

$ echo findthis > " file1"
$ echo findthis > file2
$ grep -nH "-f file1" file2
file2:1:findthis
...