передача строки с пробелами в -exe c sh внутри функции grep bash - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу рекурсивно искать строки в файлах pdf, используя pdftotext (не pdfgrep), используя функцию bash и передавая ей строку выбора. Строка должна быть способна обрабатывать специальные символы, как минимум, пробелы. Как пустая командная строка, она отлично работает в оболочке bash и демонстрирует, что я хочу сделать.

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "Air France"' \; 2>/dev/null

Но если я помещу следующий код в функцию оболочки bash, я не могу получить это на работу.

function pdfsearch () { find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color  '$1' ' \;  2>/dev/null }

Я ссылаюсь как

pdfsearch 'Air France'   and also trying pdfsearch "Air France"

, который просто дает PDF-файлы, содержащие "Air", но не "Air France"

Я также пытался использовать $ @, а также shopt -s варианты extglob et c et c. Благодарен за помощь, когда я ошибаюсь.

1 Ответ

1 голос
/ 10 февраля 2020

Часть '$1' должна быть изменена на "'"$1"'" (", ', "$1", ', "), если строка поиска подходит для двойных кавычек.

См. Следующий упрощенный пример:

[STEP 101] # cat file.txt
hello
world
hello world
[STEP 102] # foo() { find -name file.txt -exec sh -c 'cat "{}" | grep '$1' ' \; ; }
[STEP 103] # foo 'hello world'
hello
hello world
[STEP 104] #
[STEP 105] # foo() { find -name file.txt -exec sh -c 'cat "{}" | grep "'"$1"'" ' \; ; }
[STEP 106] # foo 'hello world'
hello world
[STEP 107] #
...