Regex SED:将现有模式插入到同一行上的多个其他位置

Regex SED:将现有模式插入到同一行上的多个其他位置,regex,linux,bash,parsing,sed,Regex,Linux,Bash,Parsing,Sed,我又问了一个问题:) 所以,和上次一样,我在和电话号码搏斗。这次问题有点不同。 我当前在我的文本文件中选择了这种组织: Areacode: List of phone numbers: 4444 NUM:111111 NUM:2222222 NUM:33333333 5555 NUM:1111111 NUM:2222 NUM:3333333 NUM:44444444 NUM:5555555 现在,每个区号都可能有未知的号码,而且电话号码的长度也不

我又问了一个问题:)

所以,和上次一样,我在和电话号码搏斗。这次问题有点不同。 我当前在我的文本文件中选择了这种组织:

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
我的第一个想法是在每个电话号码前再次添加一个换行符,并将这些部分与regex匹配,然后只需将第一个记住的项目添加到第二个,并将第一个添加到第三个:

\1-\2, \1-\3, etc
但当然,由于sed只能记住9个参数,而且一行中可能有10个以上的数字,所以这不起作用。此外,非固定的电话号码列表也使这成为不可能。
我再次主要关注SED选项,因为我一直在尝试熟练使用它——但当然欢迎使用其他工具提供更高效的解决方案

$cat input.txt | sed'1d;s/NUM://g'| awk'{for(i=2;i
$cat input.txt | sed'1d;s/NUM://g'| awk'{for(i=2;i这可能适用于您:

$ 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
sed '1d;:a;s/^\(\S*\)\(.*\)NUM:/\1\2,\1-/;ta;s/[^,]*,//;s/ //g' file
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555
或:


这可能适合您:

sed '1d;:a;s/^\(\S*\)\(.*\)NUM:/\1\2,\1-/;ta;s/[^,]*,//;s/ //g' file
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555
或:

TXR:

运行:

TXR:

运行:


谢谢Kev,这完全符合我的要求!谢谢Kev,这完全符合我的要求!我目前似乎只得到最后一行作为输出,但那一行是正确的。我将研究您的答案以了解您在那里做了什么。
1d
NR>1
分别删除每个解决方案中的标题行。我似乎只得到了t最后一行是当前的输出,但那一行是正确的。我将研究您的答案以了解您在那里做了什么。
1d
NR>1
分别删除每个解决方案中的标题行。
@(collect)
@area @(coll :mintimes 1)NUM:@{num /[0-9]+/}@(end)
@(output)
@(rep)@area-@num, @(last)@area-@num@(end)
@(end)
@(end)
$ txr phone.txr phone.txt
4444-111111, 4444-2222222, 4444-33333333
5555-1111111, 5555-2222, 5555-3333333, 5555-44444444, 5555-5555555

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