LINUX.ORG.RU

SED + Regexp


0

1

Есть несколько строк в которой есть дата формата 12-08-02 где ГГ.ММ.ДД но дата в строке не имеет фиксированой позиции. т.е

0000000012-08-020000000

0012-08-020000000000000

Как с помощью sed и regexp вернуть дату при первом её нахождении не читая все строки т.к дата только в первой строке. ??? Дата соответственно разная может быть.


Ответ на: комментарий от GArik

в строке есть и так 000012-08-0200000000012-08-03000000012-08-04 grep c этой строки возвращает все 3 даты а как что бы только первую найденную то есть первую 12-08-02 остальные не нужны

Klena
() автор топика

если только sed, то такое пока вылезло:

sed -n '1{s/\([0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*$/\1/1; s/^.*\([0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)/\1/p}' filename

sdio ★★★★★
()
Ответ на: комментарий от sdio

твоя команда выдаст последнюю дату в строке

:(

Тогда могу предложить только такой костыль:

sed -n '1{s|^[^-]*\([0-9]\{2\}-[0-9]\{2\}-[0-9]\{2\}\).*$|\1|;p}'

GArik ★★★
()
Ответ на: комментарий от GArik

Ага, оно.

s/^[^-]*\([0-9][0-9]-

Надо тренировать мозг на регекспы :-) у меня такая конструкция мысленно съедала все до "-" (включая 12) и я ее сразу отбросил, только теперь, подумав лишние 10 сек дошло, что это и был правильный вариант.

sdio ★★★★★
()

Вариант bash'е:

echo «000012-08-0200000000012-08-03000000012-08-04» | (IFS='-' ; read A; B=( $A ) ; echo ${B[0]: -2:2}-${B[1]}-${B[2]:0:2} )

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.