Grep игнорирует специальные символы перед применением регулярного выражения - PullRequest
0 голосов
/ 28 июня 2019

Общее

Я пытаюсь рекурсивно искать в сотнях файлов JSON в определенном каталоге строки, соответствующие определенному регулярному выражению.

grep -rh отлично подходит для рекурсивного поиска определенных строк.У меня проблема с применением регулярного выражения с поиском, потому что все строки в файлах JSON начинаются с " и заканчиваются либо ", или ".

Пример: если я хочу применить регулярное выражение, чтобы получить все строки, начинающиеся с zxc , я не смогу это сделать, поскольку строки на самом деле начинаются с "zxc

код

Следующая команда будет работать, если в начале строк не было ".

/bin/grep -rh -E "^(zxc)" "/etc/json_dir/"

Следующая команда работает, но я не хочу, чтобы grep получал сотни тысяч строк из всех файлов JSON, а затем применял регулярное выражение.

/bin/grep -rh -E ".*" "/etc/json_dir/" | /bin/sed -e 's/^"//g' -e 's/,$//g' -e 's/"$//g' | /bin/grep -E "^(zxc)"

Вопрос

Есть ли способ для grep игнорировать символ " в начале и " и ", символов в конце строк перед применением регулярного выражения?

Если нет способа, есть лиспособ сделать это с помощью другой команды bash, perl, python или другого языка.

1 Ответ

0 голосов
/ 28 июня 2019

Вы можете перейти с awk, если я правильно понимаю Ваш вопрос:

awk '{gsub(/^"|"$/,"") } # this part removes all the "s from the start and end of line
     /^WHAT/ { print } # or any other processing
     ' **/*.json

Примечание : для **/* требуется опция globestar рекурсивного сглаживания в (современном) bash.

См. Это в действии на Ideone .

Вы можете сократить его до:

awk '/^"?WHAT/' **/* # this executes the default printing action 

Но awk|sed|grep может не быть подходящим инструментом для поиска JSON.

...