2013-07-30 2 views
2

У меня есть строка, которая генерируется следующим образомSed использование, удаление/изменение текста

OK::82.44.127.13:GB:UNITED KINGDOM:ENGLAND:WOKING:-:51.000:-0.55813:+01:00 

мне нужно SED строку в основном перейти к

82.44.127.13;GB UNITED KINGDOM ENGLAND WOKING;51.000;-0.55813 

я думаю, что это потребует мульти пробегов СЭД , до сих пор у меня есть:

sed 's/:-:/;/g' (which will change the :-: to a ;) 
sed 's/:-/;-/g' (which will change the :- to a ;) 
sed s/OK:://g (which will strip the OK::) 

, но им застрял на том, как изменить: между IP- адреса и местоположения к а;, d затем удалить все остальные:, а также удалить время?

(обратите внимание, на самом деле не IP-адреса)

+0

Две подсказки для вас. Вы можете использовать несколько команд в одиночном прогоне. (например, 'sed -e 's/foo/bar /' -e 's/bar/baz /'' или 'sed -e 's/foo/bar /; s/bar/baz /'' и т. д.). во-вторых, вы можете сделать это с помощью 'cut'. – Hasturkun

ответ

3

С awk может быть проще:

$ awk -F ":" '{print $3";"$4" "$5" "$6" "$7";"$9";"$10}' <<< "OK::82.44.127.13:GB:UNITED KINGDOM:ENGLAND:WOKING:-:51.000:-0.55813:+01:00" 
82.44.127.13;GB UNITED KINGDOM ENGLAND WOKING;51.000;-0.55813 

Обратите внимание, что я печатать вещи, как $3";"$4" "$5, потому что разделитель полей меняется. В противном случае мы могли бы использовать: BEGIN{OFS=";"}

$ awk -F ":" 'BEGIN{OFS=";"}{print $3,$4,$5,$6,$7,$9,$10}' <<< "OK::82.44.127.13:GB:UNITED KINGDOM:ENGLAND:WOKING:-:51.000:-0.55813:+01:00" 
82.44.127.13;GB;UNITED KINGDOM;ENGLAND;WOKING;51.000;-0.55813 
+0

Большое спасибо, отлично работает! – adencool

+0

Хорошо читать это работает на вас. Поскольку вы новичок здесь, пожалуйста, не забудьте отметить ответ, принятый, если ваша проблема уже решена. Вы можете сделать это, нажав на галочку рядом с ответом, чтобы переключить ее с полого на зеленый. См. [Справочный центр> Задать вопрос] (http://stackoverflow.com/helpcenter/someone-answers), если у вас есть какие-либо сомнения! – fedorqui

1

Это будет делать все в одном SED команды:

$ echo "OK::82.44.127.13:GB:UNITED KINGDOM:ENGLAND:WOKING:-:51.000:-0.55813:+01:00" | \ 
sed -r 's/OK::([0-9.]*):([A-Z ]*):([A-Z ]*):([A-Z ]*):([A-Z ]*):-:(-?[0-9.]*):(-?[0-9.]*):.*/\1;\2 \3 \4 \5;\6;\7/' 
82.44.127.13;GB UNITED KINGDOM ENGLAND WOKING;51.000;-0.55813 
1

Без AWK:

cut -d: -f 3-7,9,10 | tr ":" ";" | sed -r 's/([A-Z]);([A-Z])/\1 \2/g' 
Смежные вопросы