我在test.txt中有这个输出
S1:158,525 S6:17,322,534,536,546,598 S2:317,478,484,573 S7:313,513 S3:89,107,618,625,632 S8:305,327,336,408,592 S4:30,567,568,585,588 S5:333,617,619 S10:41,202,496,603
如何让它像这样?:
S1:158c1;525c1 S6:17c6;322c6;534c6;536c6;546c6;598c6 S2:317c2;478c2;484c2;573c2 S7:313c7;513c7 S3:89c3;107c3;618c3;625c3;632c3 S8:305c8;327c8;336c8;408c8;592c8 S4:30c4;567c4;568c4;585c4;588c4 S5:333c5;617c5;619c5 S10:41c10;202c10;496c10;603c10
我希望每个有数字的S {n}输出c {n},
例如:
S1:123,1234成为S1:123c1; 1234c1
请帮我..
谢谢,
上午
答案 0 :(得分:3)
使用:
perl -pe's{S(\d+):(\S+)}{my$n=$1;"S$n:".$2=~s/\d+/$&c$n/gr=~s/,/;/gr}ge' test.txt
这里涉及三个正则表达式搜索替换:
s{...}{...}ge
每Sn:somethingnotspace
s/\d+/$&c$n/gr
)将c$n
添加到每个整数。 $&安培;是匹配,$ n在外部搜索替换中从$ 1获得。s/,/;/gr
)将所有逗号分组为分号。 / e regexp修饰符(或}ge
此处)具有代码块而不是替换字符串。执行该代码并使用它的最后一个语句作为替换。
/ r修饰符(在/ gr这里)返回regexp替换的字符串(不更改变量,但这里不重要),而不是返回它所做的更改次数(默认值)。
三个/ g修饰符搜索 - 替换每个匹配,而不仅仅是第一个匹配。
需要Perl版本5.14或更高版本才能使/r
修饰符生效(运行perl -v
以检查版本)