【问题标题】:SED: Inserting an existing pattern, to several other places on the same lineSED:将现有模式插入到同一行的其他几个位置
【发布时间】:2012-04-06 15:21:06
【问题描述】:

我又问了一个 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 选项,因为我一直在努力精通它 - 但当然欢迎使用其他工具提供更有效的解决方案!

【问题讨论】:

    标签: regex linux bash parsing sed


    【解决方案1】:
    $ 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
    

    【讨论】:

    • 感谢 Kev,这正是我所要求的!
    【解决方案2】:

    这可能对你有用:

    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
    

    或:

    awk 'NR>1{gsub(/NUM:/,","$1"-");sub(/[^,]*,/,"");gsub(/ /,"");print}' file
    4444-111111,4444-2222222,4444-33333333
    5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555
    

    【讨论】:

    • 我目前似乎只得到最后一行作为输出,但那是正确的。我会研究你的答案以了解你在那里做了什么..
    • 1dNR&gt;1 分别删除每个解决方案中的标题行。
    【解决方案3】:

    TXR:

    @(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2016-05-10
      相关资源
      最近更新 更多