sed 用数字 1 替换数字

sed replace number with number-1

sed 可以处理替换并同时计算表达式以某种方式进行替换吗?

例如,我在文本文件中有以下条目:

##################################### topd Tree1 - Tree14 #######################################

由于我不会深入探讨的原因,相对于我目前使用的另一种编号方案,每棵树的编号都是 N+1。

可以 sed(或者任何实用程序,sed 只是我用于查找和替换操作的工具),找到 TreeN 的每个实例并用 TreeN-1 替换它们,这样上面然后行看起来像:

##################################### topd Tree0 - Tree13 #######################################

(使用 Ubuntu 12.02,几乎任何事情都可以。)

在这种情况下,我将使用 perl,使用 e 修饰符来评估替换部分中的表达式:

perl -pe 's/(Tree)(\d+)/ . ( - 1)/ge'

您还可以利用更高级的正则表达式支持,例如通过使用回顾断言:

perl -pe 's/(?<=Tree)(\d+)/ - 1/ge'

使用 perl

perl -pe 's/Tree\K\d+/$&-1/ge' file

输出

##################################### topd Tree0 - Tree13 #######################################

你可以试试这个;

sed 's/[^0-9,-]*//g' filename | sed -e "s/-/ /g" | awk '{print "##################################### topd Tree"-1 " - Tree" -1 " #######################################"}'

awk '{gsub(/Tree/,"Tree ",[=10=]);print " "" "-1" "" "-1" "}' filename

下面使用gnu awk

awk '{
    for(i=1;i<=NF;i++){
     $i ~ /^Tree[[:digit:]]+$/
     {
     n=(gensub(/Tree/,"",1,$i)-1);
     $i=gensub(/Tree([[:digit:]]+)/,"Tree"n,1,$i);
     }
     }
     print}' file

会成功的