Python3 - Выполнение команды find xargs grep приводит к выводу, отличному от shell - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь выяснить, содержит ли файл указанную строку c. Для этого я использую следующую команду в оболочке:

find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l

Она выводит путь и имя файла json, который содержит точную строку.

Если я копирую ту же самую команду в python, используя popen, возвращаемое значение пустое:

find_result = os.popen('find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l').read()

Я выяснил, если я удалю строку поиска до двоеточия между _id и фактическим идентификатором, он что-то вернет:

find_result = os.popen('find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\"" -l').read()

Но как только я поставлю "\"_id\" с двоеточием, как это "\"_id\":, оно больше не будет работать.

Если я использую свой терминал для той же команды, я могу что-то найти.

Что такого особенного в :, что он не будет работать с popen в Python3? Я что-то здесь пропускаю?

Большое спасибо за вашу помощь, потому что этот вопрос выглядит очень особенным.

Редактировать:

Если я использую только grep, у меня точно такая же проблема с двоеточием:

grep "\"_id\": \"asdf-qwer-yxcv-dfgh\"" ~/my_json_files/*.json -l

Решение:

Обе команды работают, если будет использоваться необработанная строка (поставьте r перед string):

find_result = os.popen(r'find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l').read()

Но я до сих пор не знаю, почему двоеточие влияет на него, потому что я думаю, что экранирование символов может привести к ошибке, которая предшествует двоеточию?

...