regex - SED:将现有模式插入同一行的其他几个地方

标签 regex linux bash parsing sed

又是我的 SED 问题 :)

因此,与上次一样,我正在努力处理电话号码。这次的问题有点不同。 我目前在我的文本文件中有这种组织:

Areacode:    List of phone numbers:
4444         NUM:111111  NUM:2222222 NUM:33333333
5555         NUM:1111111 NUM:2222    NUM:3333333  NUM:44444444 NUM:5555555

现在,每个区号都可以有未知号码,而且电话号码的长度也不固定。 我想知道的是,我怎样才能将区号和电话号码组合起来,看起来像这样:

4444-111111, 4444-2222222, 4444-33333333

我的第一个想法是在每个电话号码前再次添加一个换行符,并将这些部分与正则表达式匹配,然后将第一个记住的项目添加到第二个,然后将第一个添加到第三个:

\1-\2, \1-\3, etc

当然,因为 sed 只能记住 9 个参数,而且一行中可以有超过 10 个数字,所以这是行不通的。此外,电话号码的非固定列表也使这成为不可能。 我再次主要关注 SED 选项,因为我一直在努力精通它 - 但当然欢迎使用其他工具提供更高效的解决方案!

最佳答案

$ cat input.txt | sed '1d;s/NUM:/ /g' | awk '{for(i=2;i<=NF;i++)printf("%s-%s%s", $1, $i, i==NF?"\n":",")}'
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555

关于regex - SED:将现有模式插入同一行的其他几个地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815933/

相关文章:

javascript - 如何只匹配那些前面有偶数个 `%` 的数字?

linux - 只打印第一个和最后一个匹配的模式

linux - If 语句将变量与列表中的文件进行比较

linux - 在 linux bash 脚本中的 awk 中执行日期实用程序

regex - Perl - 使用正则表达式删除字符串中的第一个单词

regex - 使用正则表达式检查字符串是否以数字开头

linux - 使用 FUSE 时如何将所有现有目录挂载到挂载点?

linux - 如何停止分钟的 cron 工作?

linux - 树莓派上的 Ubuntu Mate 卡在颜色测试屏幕上 : first boot

javascript - 使用正则表达式用修改后的数字替换字符串中的数字 - Javascript