首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对数字范围使用sed命令

对数字范围使用sed命令
EN

Stack Overflow用户
提问于 2011-08-31 15:20:30
回答 5查看 2K关注 0票数 2

我有个城市和电话号码的档案。这是一个csv文件

代码语言:javascript
运行
复制
New York , 23456      
chicago, 123,456,789,889981(2-6)    
phoenix  123,76(0-3)    

文件中的范围编号我要将其替换为每个数字。例如,我想将889981(2-6)更改为8899812,8899813,8899814,8899815,8899816,并插入到同一行。我能在sed中找到它吗?它需要扫描整个文件并进行替换。

EN

回答 5

Stack Overflow用户

发布于 2011-08-31 15:42:41

sed在算术方面不是很好;我认为这不是不可能的,但也不是非常简单。我的建议是使用一种合适的脚本语言,比如awk、Perl或python (如果您不熟悉它们中的任何一种,可以使用Python;如果您希望尽可能减少内存占用,请使用awk;如果您已经了解perl,请务必使用Perl)。

代码语言:javascript
运行
复制
perl -pe 's/(\d+)\((\d+)-(\d+)\)$/ join (",", 
          (join ("", $1, $2) .. join ("", $1, $3))) /ge' file
票数 4
EN

Stack Overflow用户

发布于 2011-08-31 15:42:41

不,这超出了您仅使用正则表达式所能做到的范围。你需要添加一些更强大的东西,比如perlpythonawk,或者你最熟悉的任何东西。

票数 2
EN

Stack Overflow用户

发布于 2011-08-31 17:29:22

使用awk的解决方案(@glenn jackman可能会在不到5行的时间内发布一些内容):

代码语言:javascript
运行
复制
# join.awk --- join an array into a string
function join(array, start, end, sep,    result, i)
{
    if (sep == "")
       sep = " "
    else if (sep == SUBSEP) # magic value
       sep = ""
    result = array[start]
    for (i = start + 1; i <= end; i++)
        result = result sep array[i]
    return result
}


function range(input) {
    split(input, a, "[(-)]")
    # [1] is startvalue, [2] is start and stop for range
    split(a[2], b, "-")
    # [1] is start range, [2] is stop range
    # create 1st number by appending start range to start value
    c[1] = a[1] b[1]
    n=2
    for(i=b[1]; i<=b[2]; i++){
        c[n] = c[n-1] + 1
        n++
    }
    return join(c, 1, b[2], ",")

}

# a line containing a -
/-/ {
    for(i=1;i<=NF;i++){
        if ($i ~ /-/) {
        printf("%s,", range($i))
        }
        printf("%s,", $i)
    }
    print ""
}
!/-/{print}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7253778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档