如何搜索特定前缀并为其每个数字添加新字符?

时间:2018-04-06 07:00:02

标签: linux perl awk sed

我在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

请帮我..

谢谢,
上午

1 个答案:

答案 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{...}{...}geSn: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以检查版本)