2

我有一个生成如下的字符串

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,到目前为止我有:

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地址和位置之间的:更改为;,然后删除所有其他:,并剥离时间?

(注意不是真正的IP地址)

4

3 回答 3

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
于 2013-07-30T13:15:55.407 回答
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
于 2013-07-30T13:22:36.110 回答
1

没有awk:

cut -d: -f 3-7,9,10  | tr ":" ";" | sed -r 's/([A-Z]);([A-Z])/\1 \2/g'
于 2013-07-30T15:56:02.203 回答