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

1

あなたはvimに言及しました 、ここに行きます:

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