2016-01-31 3 views
1

Есть ли способ упростить следующее: sed (не используя другой двоичный код, только sed), учитывая требование переупорядочить числовые блоки?Любой способ упростить следующее sed?

echo "server16 :: FetchChannels.20160131.170019.875685.16232510.22" | 
sed -e 's/\ \:\:\ \([a-zA-Z]*\)\.\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\.\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\ \ \5\:\6\:\7\ \4\/\3\/\2\ \ \1/g' \ 
    -e 's/\..*//g' 

Пример вывода:

server16 17:00:19 31/01/2016 FetchChannels 
+1

Вы бы, возможно, сделать лучше, используя формат даты ISO 8601 для вывода, такие как '2016-01-31 17: 00: 19' - это будет проще сортировать , и т. д., и является культурно нейтральным (или «иностранным» для всех). –

ответ

2
echo "server16 :: FetchChannels.20160131.170019.875685.16232510.22" | \ 
sed -re 's| :: ([a-zA-Z]*)\.([0-9]{4})([0-9]{2})([0-9]{2})\.([0-9]{2})([0-9]{2})([0-9]{2}).*| \5:\6:\7 \4/\3/\2 \1|' 
  • Использование -Ee вместо этого на Mac OS X
  • Добавление -r (или -E на OSX), чтобы удалить некоторые \.
  • Изменение / к | так / не нужно экранировать
+1

Хорошая работа. Только оболочка С требует обратную косую черту после символа трубы; реальных оболочек нет. –

1

Это может работать для вас (GNU СЭД):

sed -r 's/(.*)::(.*)\.(....)(..)(..)\.(..)(..)(..).*/\1\6:\7:\8 \5\/\4\/\3\2/' file 

согласующего :: и . «s, скорее всего, сделать это уникальный матч.

Или, если вы предпочитаете:

sed 's/\(.*\)::\(.*\)\.\(....\)\(..\)\(..\)\.\(..\)\(..\)\(..\).*/\1\6:\7:\8 \5\/\4\/\3\2/' file 
Смежные вопросы