有什么方法可以在模式匹配后增加sed中的一些数字

时间:2013-02-04 06:21:08

标签: linux sed

有什么方法可以在模式匹配后在sed中增加一些数字

假设我有这个文件

201 AD BBH NN
376 AD HGH JU

我想匹配起始整数,然后在sed

中添加数字5

这可能吗

2 个答案:

答案 0 :(得分:3)

您最好使用更高级的工具,例如awk

pax$ cat qq.in
201 AD BBH NN
376 AD HGH JU

pax$ awk '{ print $0 " " $1+5 }' qq.in
201 AD BBH NN 206
376 AD HGH JU 381

如果你真的必须sed中这样做,那么,是的,它可以完成。但这很丑陋。请参阅here了解相关操作方法:

#!/usr/bin/sed -f
/[^0-9]/ d
# replace all leading 9s by _ (any other character except digits, could
# be used)
:d
s/9\(_*\)$/_\1/
td

# incr last digit only.  The first line adds a most-significant
# digit of 1 if we have to add a digit.
#
# The tn commands are not necessary, but make the thing
# faster

s/^\(_*\)$/1\1/; tn
s/8\(_*\)$/9\1/; tn
s/7\(_*\)$/8\1/; tn
s/6\(_*\)$/7\1/; tn
s/5\(_*\)$/6\1/; tn
s/4\(_*\)$/5\1/; tn
s/3\(_*\)$/4\1/; tn
s/2\(_*\)$/3\1/; tn
s/1\(_*\)$/2\1/; tn
s/0\(_*\)$/1\1/; tn

:n
y/_/0/

这个特殊的脚本在一个数字上加1,你现在(希望)能理解为什么我称之为对接丑陋。试图用sed做这件事就像试图用金鱼砍伐卡里树一样。

您应该使用正确的工具来完成工作。

答案 1 :(得分:0)

用awk你可以尝试

cat fileName | awk '{num = 0; if ($1 ~ /[0-9][0-9][0-9]/) num = $1 + 5; print num $1 $2 $3;}'