Учитывая некоторый каталог верхнего уровня -, topdir
, в котором расположены все ваши сжатые файлы, и при условии, что вы используете реализацию GNUzgrep
:
zgrep -R -l -F --include='*.gz' -e 'string' topdir
Это приведет к поиску string
как подстроки в любом изgzip
-сжатых файлов в topdir
и вернет пути ко всем совпадающим файлам.
Используя zgrep
в системе без GNU zgrep
, вы, скорее всего, не сможете использовать --include
. Это может не быть проблемой, если ваш topdir
содержит только сжатые файлы, но если вы хотите искать только файл с суффиксом имени файла .gz
, вы можете сделать
find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +
При этом будут найдены все обычные файлы с именами, заканчивающимися на .gz
, в папке topdir
и будет выполняться данная команда zgrep
для как можно большего количества файлов.
Если у вас даже нет zgrep
, вы можете сделать
find topdir -type f -name '*.gz' -exec sh -c '
for pathname do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done' sh {} +
При этом каждый файл извлекается и проходит через обычный grep
. Если найдена строка, содержащая заданную строку, печатается путь к файлу.
Обратите внимание, что «внутренний» сценарий оболочки представляет собой цикл, который можно легко изменить для работы со всеми*.gz
-файлами в одном каталоге:
for pathname in./*.gz; do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done
Если вы хотите сопоставить string
как полное слово, а не как подстроку, добавьте -w
к вызовам grep
выше. Если string
нужно интерпретировать как регулярное выражение,удалить -F
.
Я бы использовал для этого awk
с конечным автоматом. Я использую флаги blank
и block
для обозначения пустой строки и блока
awk '
/^$/ { blank++ } # Blank line
blank && /^>/ { blank=0; block++; print "<blockquote>" } # First ">" line after blank
block && blank { block=0; print "</blockquote>" } # First blank after ">"
/^./ { blank=0 } # Non-blank line
{ print } # Print the input data
'
Тестовые данные
One blank line below
> This is a text
> This is another line of text
One blank line above
------------------------------------
One blank line below
> This is a text
> This is another line of text
One blank line above
------------------------------------
One blank line below
> This is a text
> This is another line of text
One blank line above
Выход
One blank line below
<blockquote>
> This is a text
> This is another line of text
</blockquote>
One blank line above
------------------------------------
One blank line below
> This is a text
> This is another line of text
One blank line above
------------------------------------
One blank line below
<blockquote>
> This is a text
</blockquote>
<blockquote>
> This is another line of text
</blockquote>
One blank line above