4

Поэтому я пытаюсь сопоставить последовательность номеров года с помощью grep, и это должно быть легко. Я просто немного озадачен тем, что мое упрощенное регулярное выражение не работает.

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

<span class='t-d'>1994-Oct-28</span>

Это всего лишь один пример, когда у меня есть это, я хочу взять только часть 1994 года и использовать это для продолжения архивирования до нужного года. Я предполагал, что что-то вроде этого будет достаточно:

grep -o '[0-9]{4}'

Но это не похоже ни на что. Когда я пытаюсь что-то вроде:

grep -o '[0-9]'

это соответствует всем отдельным числам, поэтому 1 9 9 4 2 и 8.

Так что мой синтаксис неправильный, но, насколько мне известно, это соответствует числу от 0 до 9 4 раз, причем длина {} указывает либо диапазон, либо точный диапазон. Если бы кто-то мог помочь мне с этим простым синтаксисом, он был бы очень признателен.

1 ответ1

5

{4} является расширенным регулярным выражением. grep не поймет этого, если вы не укажете опцию -E :

-E, --extended-regexp
       Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.)

попробуй с

grep -E '[0-9]{4}'

пример

$ echo abcd1234abcd | grep -o -E '[0-9]{4}'
1234

Вы также можете использовать класс символов [:digit:] чтобы избежать проблем с локалями, где порядок символов может быть другим:

$ echo abcd1234abcd | grep -o -E '[[:digit]]{4}'
1234

если по какой-либо причине вы не хотите использовать расширенные регулярные выражения, вы можете использовать

grep -o '[0-9][0-9][0-9][0-9]'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .