关键字后添加常量

时间:2013-01-03 15:56:59

标签: vim sed awk grep

我有一个关于文本文件操作的问题。 我有类似的东西

any text keyword 21 any text 32 any text
any text keyword 12 any text keyword 12 any text 23 any text
any text keyword 34 any text (keyword 45) any text (34) any text

现在我想知道我是否可以grep / awk / sed / vi / ..以某种方式在关键字后添加常量? 例如,我想添加e。 G。关键字后的每个整数的值为10,但其他数字和文件格式是否相同?

any text keyword 31 any text 32 any text
any text keyword 22 any text keyword 22 any text 23 any text
any text keyword 44 any text (keyword 55) any text (34) any text

抱歉,到目前为止我找不到任何东西......

5 个答案:

答案 0 :(得分:3)

如果Perl解决方案适合您:

perl -pe 's/(?<=keyword )(\d+)/$1+10/ge;' file

答案 1 :(得分:1)

你提到 vim ,这里是:

:%s/\v(keyword )@<=[0-9]+/\=submatch(0)+10/g

答案 2 :(得分:1)

我为sed版本尝试了 hard

sed 's/keyword[ \t]*\([0-9]*\)/keyword $(( \1 + 10))/g;
     s/"/\\"/g;
     s/^/echo \"/;
     s/$/\"/' input | 
  sh

答案 3 :(得分:0)

这很有效。现在我承认我不是专家,所以可能有更短的方法来做到这一点,但这就是我一起入侵的地方:

#!/bin/sh

cat $1 | awk \
'function incr(str) {
    if (match(str, "[0-9]+")) {
        number = substr(str, RSTART, RLENGTH)
        number = number+10
        printf("keyword %d",number)
        str = substr(str, RSTART+RLENGTH)
    }
}
function findall(str, re) {
    where=match(str, re)

    if (where==0)
    {
      print(str)
    }
    else
    {
      printf("%s", substr(str, 0, RSTART-1))
      offset=RSTART+RLENGTH
      incr(substr(str, RSTART, RLENGTH))
      str = substr(str, offset)
      findall(str, re)
    }
}
{
    findall($0, "keyword [0-9]+");
}'

答案 4 :(得分:0)

看看这个perl解决方案

perl -pe 's/keyword (\d)+/"keyword ".($1 + 10)/eg' your_file

如果你想从总和中排除一些数字(本例中为34和35)

perl -pe 's/keyword (\d)+/if ($1 != 34 && $1 != 35) { "keyword ".($1 + 10) } else { "keyword ".$1 }/eg' your_file