3

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

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/.. 以某种方式在关键字之后添加常量?例如,我想在关键字后的每个整数中添加例如 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

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

4

5 回答 5

3

如果 Perl 解决方案适合您:

perl -pe 's/(?<=keyword )(\d+)/$1+10/ge;' file
于 2013-01-03T16:13:40.823 回答
1

我努力尝试一个sed版本:

sed 's/keyword[ \t]*\([0-9]*\)/keyword $(( \1 + 10))/g;
     s/"/\\"/g;
     s/^/echo \"/;
     s/$/\"/' input | 
  sh
于 2013-01-04T03:44:51.500 回答
1

你提到vim,这里是:

:%s/\v(keyword )@<=[0-9]+/\=submatch(0)+10/g
于 2013-01-03T16:31:36.057 回答
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
于 2013-01-03T17:14:31.027 回答
0

这行得通。现在我承认我不是 awk 专家,所以可能有更短的方法来做到这一点,但这是我一起破解的:

#!/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]+");
}'
于 2013-01-03T16:42:07.877 回答