2016-11-07 2 views
0
echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | \ 
sed -rn "s/(.*\|)([0-9]{4}-[0-9]{2}-[0-9]{2})\ ([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3})\2\3/p" 

Привет, ребята,Regex для извлечения даты и времени из журнала

я пытаюсь извлечь дату и время в строке выше. Не могли бы вы рассказать мне, чего не хватает?

Я получаю эту ошибку, не зная, как устранить это

sed: -e expression #1, char 81: unterminated `s' command 
+1

отсутствующего средний '/' символ? то есть 'sed 's /..../ \ 2 \ 3/p''? Удачи. – shellter

ответ

2

не замена строки в вашей команде. Команда s должна содержать 3 разделителя: s/pattern/string/.

Попробуйте это:

$ echo "INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html" | sed -rn "s/.*\|([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}).*/\1/p" 
2016-11-0618:44:07.577 

Кроме того, как указано в комментариях:

  • вам просто нужна одна группа записи даты и времени
  • многоточий символы должны быть экранированы в шаблоне (\.[0-9]{3} , не .[0-9]{3}), но не пробелами ({2} [0-9], а не {2}\ [0-9]
+0

вам не потребуется экранирование символа пробела, но вам нужно экранирование символа точки (миллисекунды), если вы хотите быть точным (и вам не нужно создавать группу для первой группы, вы можете написать '\ 1 \ 2' после этого. В противном случае работает. –

+0

@ Jean-FrançoisFabre Вы правы. Я редактировал. – SLePort

2

awk или cut лучше подходит для этой задачи

$ s='INFO|2016-11-06 18:44:07.577|G|SOME_THING_IN_CAPS|/something/pages1.html' 

$ echo "$s" | awk -F\| '{print $2}' 
2016-11-06 18:44:07.577 

$ echo "$s" | cut -d\| -f2 
2016-11-06 18:44:07.577 
Смежные вопросы