2013-07-02 50 views
1

我想冒号后一切分离:两个独立的值之前和之后。单独字符串变量

Server Id: 9 
Completed: 0 
In Error: 0 
Added To Queue: 0 
Waiting: 0 
In Progress: 0 
Total Processed: 0 
Processing Rate: 0 
FinalStatus:0, GOOD 

预期查看:

Server Id|9 
Completed|0 
... 

我能够得到一个排的只有最后一栏

grep -oP '(?<=:)\w+' 

,我想知道如何来分隔值。

+1

将你分开后,*你想要对他们做什么* *?你确实想把它们打印成“a | b”吗?在这种情况下,它更简单变异的分隔符:'perl的-pe的/:*/| /'' –

+0

你的意思是你要的分隔符改成管道'|'字符? – Borodin

+0

@JulianFondren:你应该将其作为答案发布。 – Borodin

回答

2

简单的awk命令会给你的输出:

awk -F ":" '{sub(/^ +/, "", $2); print $1"|"$2}' file 

但不得不说,你的问题是含糊和不明确的,如果这真的是你所需要的。

+0

这就是我的意思是谢谢 –

+0

不客气,很高兴它解决了。 – anubhava

+0

如果我想在不同的视图上分割如何做到这一点,例如: '{“eventid”:“服务器ID,”状态“:”9“},' 我制作了 'awk -F”:“'{ sub(/^+ /,“”,$ 2); print“{\”eventid \“:\”“$ 1”,\“status \”:\“”$ 2“”}''但不能添加(“ },)字符结尾。 –

1

如果你只是想用管道字符替换冒号分隔符,那么这一个行Perl程序会做什么你问

perl -ne "print join '|', split /:\s*/" myfile 

输出

Server Id|9 
Completed|0 
In Error|0 
Added To Queue|0 
Waiting|0 
In Progress|0 
Total Processed|0 
Processing Rate|0 
FinalStatus|0, GOOD 
+0

它取代* all *'/:\ s * /',所以“FinalStatus:1,错误:太多分隔符”会变成“ FinalStatus | 1,错误|太多分隔符“。如果你喜欢,你可以用'split /:\ s * /,$ _,2'来限制它到第一个分隔符。 –

+0

非常好的例子谢谢 –

1

我想添加使用正则表达式

perl -ne '$_ =~ s/:\s?/|/; print $_' myfile 
多一个选择0

输出:

Server Id|9 
Completed|0 
In Error|0 
Added To Queue|0 
Waiting|0 
In Progress|0 
Total Processed|0 
Processing Rate|0 
FinalStatus|0, GOOD 
+0

没有必要在's ///'右边的'|'上加反斜线,或者把'$ _'放在双引号中,或者显式地加上'$ _ =〜'。请至少避免第一个:不必要的反斜杠主动混淆,它们使得看起来非常特别。 –

+0

@Julian Fondren:修正了谢谢指出:) –

+0

尝试:'perl -ple's/\ s * \:\ s */| /'file'请参阅perldoc perlrun http://perldoc.perl.org/perlrun的.html#命令交换机 – shawnhcorey

1

在GNU sed中,

sed 's/ *: */|/g' file 
1

如果任务真的那么简单,你的建议,然后在这里是一个非常简单的答案:

tr ":" "|" < file.txt 

或在perl版本;-)

perl -pe 'tr{:}{|}' file.txt