我有个城市和电话号码的档案。这是一个csv文件
New York , 23456
chicago, 123,456,789,889981(2-6)
phoenix 123,76(0-3)
文件中的范围编号我要将其替换为每个数字。例如,我想将889981(2-6)更改为8899812,8899813,8899814,8899815,8899816,并插入到同一行。我能在sed中找到它吗?它需要扫描整个文件并进行替换。
发布于 2011-08-31 15:42:41
sed
在算术方面不是很好;我认为这不是不可能的,但也不是非常简单。我的建议是使用一种合适的脚本语言,比如awk、Perl或python (如果您不熟悉它们中的任何一种,可以使用Python;如果您希望尽可能减少内存占用,请使用awk;如果您已经了解perl,请务必使用Perl)。
perl -pe 's/(\d+)\((\d+)-(\d+)\)$/ join (",",
(join ("", $1, $2) .. join ("", $1, $3))) /ge' file
发布于 2011-08-31 15:42:41
不,这超出了您仅使用正则表达式所能做到的范围。你需要添加一些更强大的东西,比如perl
、python
或awk
,或者你最熟悉的任何东西。
发布于 2011-08-31 17:29:22
使用awk
的解决方案(@glenn jackman可能会在不到5行的时间内发布一些内容):
# 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}
https://stackoverflow.com/questions/7253778
复制相似问题