Заменить пустую строку и строку под ней на с помощью sed

Учитывая некоторый каталог верхнего уровня -, 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.

0
14.04.2021, 22:42
1 ответ

Я бы использовал для этого 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
2
28.04.2021, 22:52

Теги

Похожие вопросы