Вопрос или проблема
Предположим, у меня есть строка следующего вида:
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
с поддержкой регулярных выражений. Предположим, у вас есть файл, содержащий различные строки, включая желаемые временные метки.
Вот как можно это сделать:
- Использование GNU grep: Если у вас установлена версия grep с поддержкой Perl-совместимых регулярных выражений, вы можете воспользоваться следующей командой:
grep -oP 'title="\K[0-9-]{10} [0-9:]{8}Z(?=")' filename
Эта команда выполнит следующее:
-o
– выводит только совпадающие части.-P
– включает поддержку Perl-совместимых регулярных выражений.\K
– сбрасывает начало совпадения, так что всё, что совпадает с ним, не будет включено в вывод.(?=")
– указывает на позицию перед закрывающей кавычкой, не включая ее в вывод.
Таким образом, данное регулярное выражение извлечет только временные метки, содержащиеся в строках с title
.
- Пример использования: Предположим, что содержимое файла
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
- Дополнительная проверка на совпадение формата: Если вам нужно получать временные метки только в определенном формате, вы можете изменить регулярное выражение так, чтобы оно соответствовало вашим требованиям. Например, для извлечения временных меток без даже такой строки, как
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
.
Таким образом, вы получаете эффективно работающую команду для извлечения временных меток из строк в заданном формате.