Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何搜索特定前缀并为其每个数字添加新字符?_Linux_Perl_Awk_Sed - Fatal编程技术网

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

Linux 如何搜索特定前缀并为其每个数字添加新字符?,linux,perl,awk,sed,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

我在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:1234变为S1:123c1;1234c1

请帮帮我。。

谢谢
Am工作:

perl -pe's{S(\d+):(\S+)}{my$n=$1;"S$n:".$2=~s/\d+/$&c$n/gr=~s/,/;/gr}ge' test.txt
此处涉及三个regexp搜索替换:

  • 外部的
    s{…}{…}ge
    Sn:somethingnotspace
  • 第一个内部变量(
    s/\d+/$&c$n/gr
    )将
    c$n
    添加到每个整数中是匹配项,在外部搜索替换中从$1获取$n
  • 第二个内部字符(
    s/,/;/gr
    )将所有逗号更改为分号
/e regexp修饰符(或此处的
}ge
具有代码块,而不是用于替换的字符串。执行该代码并使用其最后一条语句作为替换

/r修饰符(如这里的/gr)返回regexp替换的字符串(不更改变量,但这在这里并不重要),而不是返回所做更改的数量(默认值)

“三个/g修改器”搜索将替换每个匹配项,而不仅仅是第一个匹配项


需要Perl版本5.14或更高版本才能使用
/r
修饰符(运行
Perl-v
检查版本)

欢迎使用堆栈溢出,请在post.cat test.txt | awk'/S1:/{gsub(“,”,“c1;”,$0);打印;下一次{print$0}它将输出S1:158c1;525 S6:17c1;322c1;534c1;536c1;546c1;598 S2:317c1;478c1;484c1;573 S7:313c1;513 S3:89c1;107c1;618c1;625c1;632 S8:305c1;327c1;336c1;408c1;592 S4:30c1;567c1;568c1;585c1;588 S5:333c1;617c1;619 S10:41c1;202c1;496c1;请不要在这个问题上简单地扣减分数,这是对你的不尊重。如果我有一段时间没有回复,那表示我正忙于工作。非常抱歉没有回复。无论如何,谢谢大家的帮助,我找到了自己的解决方案。@Amz您的awk解决方案在
603
后面的最末端缺少
c10
,不是吗?(和cn在每一个最后的数字)天哪,这工作完美!谢谢你,杰蒂尔,你太棒了!