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

标签 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

请帮我..

谢谢,
我是

最佳答案

作品:

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 正则表达式修饰符(或这里的 }ge)有一个代码块而不是用于替换的字符串。执行该代码并使用它的最后一条语句作为替换。

/r 修饰符(如此处的/gr)返回正则表达式替换的字符串(不更改变量,但这在这里并不重要)而不是返回它所做的更改数(默认值)。

三个/g 修饰符搜索替换每个匹配项,而不仅仅是第一个。

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

关于linux - 如何搜索特定前缀并为其每个数字添加新字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49687147/

相关文章:

perl - 如何将数组从 weaver.ini 传递到 Pod::Weaver 插件

perl - 如何在不创建额外进程的情况下访问 gzip 文件?

mysql - 如何在 DBIx::Class 的 SELECT 部分使用子查询?

linux - 如何根据 linux 中的键列合并两个文件的内容

尽管某些字符不匹配模式,但正则表达式仍要匹配?

linux - 使用 awk 输出运行 mysqldump

android - 无法在 Linux 上启动 Android 设备模拟器

linux - 在两个 IP 地址上设置 dask 分布式调度程序?

Java Clipboard on Linux (text only),有的程序可以读,有的不能,为什么

linux - 使用 xen 镜像获取目录大小