grep подстроку в кавычках

Вопрос или проблема

Предположим, у меня есть строка следующего вида:

title="2010-09-11 11:22:45Z"

Как мне grep получить саму дату и игнорировать кавычки/название/Z?

Файл может содержать другие строки, такие как:

случайнаястрока
title="2010-09-11 11:22:45Z"
title="игнорируй меня"

Таким образом, я хочу grep только временные метки с помощью одной команды grep.

С помощью GNU grep вы можете сделать следующее:

$ echo 'title="2010-09-11 11:22:45Z"' | grep -oP 'title="\K[^"]+'
2010-09-11 11:22:45Z

Если ввод будет только в таком формате, то ниже представленная команда легко решит вашу задачу

echo "title=\"2010-09-11 11:22:45Z\""| cut -d '"' -f2 

grep -oP '[0-9-]{10} [0-9:]{8}' filename

Это должно работать только на версии GNU grep:

<file.html grep -oP "(?<=title\=\")\d+-\d+-\d+"

Пример на regex101 здесь.

Команда для выбора всего между кавычками:

echo 'title="2010-09-11 11:22:45Z"' | grep -oP "(?<=\").*(?=\")"

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

Например,

echo 'title="2010-09-11 11:22:45Z"' | grep -oP "(?<=\")[0-9-]{10} [0-9:]{8}Z(?=\")"

Будет соответствовать временной метке, но не тексту игнорируй меня.

Ответ или решение

Для решения задачи извлечения временных меток из строк, содержащих текст в формате title="дата", можно использовать команду grep с поддержкой регулярных выражений. Предположим, у вас есть файл, содержащий различные строки, включая желаемые временные метки.

Вот как можно это сделать:

  1. Использование GNU grep: Если у вас установлена версия grep с поддержкой Perl-совместимых регулярных выражений, вы можете воспользоваться следующей командой:
grep -oP 'title="\K[0-9-]{10} [0-9:]{8}Z(?=")' filename

Эта команда выполнит следующее:

  • -o – выводит только совпадающие части.
  • -P – включает поддержку Perl-совместимых регулярных выражений.
  • \K – сбрасывает начало совпадения, так что всё, что совпадает с ним, не будет включено в вывод.
  • (?=") – указывает на позицию перед закрывающей кавычкой, не включая ее в вывод.

Таким образом, данное регулярное выражение извлечет только временные метки, содержащиеся в строках с title.

  1. Пример использования: Предположим, что содержимое файла example.txt выглядит следующим образом:
randomstring
title="2010-09-11 11:22:45Z"
title="disregard me"

Запустив команду:

grep -oP 'title="\K[0-9-]{10} [0-9:]{8}Z(?=")' example.txt

Вы получите следующий вывод:

2010-09-11 11:22:45Z
  1. Дополнительная проверка на совпадение формата: Если вам нужно получать временные метки только в определенном формате, вы можете изменить регулярное выражение так, чтобы оно соответствовало вашим требованиям. Например, для извлечения временных меток без даже такой строки, как title="disregard me", вы можете использовать следующее выражение:
grep -oP 'title="\K[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}Z(?=")' filename

Эта команда будет искать строки, в которых дата написана в формате YYYY-MM-DD HH:MM:SSZ.

Таким образом, вы получаете эффективно работающую команду для извлечения временных меток из строк в заданном формате.

Оцените материал
Добавить комментарий

Капча загружается...