我有一个关于文本文件操作的问题。 我有类似的东西
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
抱歉,到目前为止我找不到任何东西......
答案 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