【问题标题】:add constant after keyword在关键字后添加常量
【发布时间】:2012-12-18 00:32:45
【问题描述】:

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

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

对不起,我目前没有找到任何东西......

【问题讨论】:

  • 对于像keyword NAN这样的损坏输入应该怎么办?
  • 我刚得到这个建议,awk '{for (i=1;i
  • @Christoph:你可以用if ($i!=34) { $i += 10 }代替$i += 10

标签: vim sed awk grep


【解决方案1】:

如果 Perl 解决方案适合您:

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

【讨论】:

  • 非常感谢!是否可以排除一种模式,例如“不替换关键字 34”?
  • 你想要-p-n
【解决方案2】:

你提到了 vim,就这样吧:

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

【讨论】:

  • 非常感谢!是否可以排除一种模式,例如“不替换关键字 34”?
【解决方案3】:

这行得通。现在我承认我不是 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]+");
}'

【讨论】:

  • 这似乎没有检查“关键字”是否在数字之前。
  • 啊,我没有仔细阅读原始问题。我会尝试修改答案。
  • 对其进行了编辑以包含对“关键字”的要求。我敢肯定 awk 专家会笑。我发现这个问题对我完成练习很有帮助,所以我很高兴发布原始问题。
【解决方案4】:

看看这个 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

【讨论】:

    【解决方案5】:

    努力尝试了sed 版本:

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

    【讨论】:

    • 好把戏;那真的很辛苦。您是否也不需要转义现有的$(也许还有一些像反引号这样的字符?)
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2021-02-02
    • 2011-05-20
    相关资源
    最近更新 更多