sed用number-1替换号码

时间:2016-07-13 10:05:14

标签: bash replace sed expression-evaluation

可以sed处理替换并同时评估表达式以某种方式替换吗?

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

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

由于我不会参与的原因,相对于我到目前为止使用的另一个编号方案,每个树的数字是N + 1。

可以sed(或者任何实用程序,sed只是我的查找和替换操作),查找TreeN的每个实例并将其替换为TreeN-1,以便上面的行然后看起来像:

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

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

4 个答案:

答案 0 :(得分:3)

使用perl

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

输出

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

答案 1 :(得分:1)

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

e

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

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

答案 2 :(得分:0)

你可以试试这个;

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

awk '{gsub(/Tree/,"Tree ",$0);print $1" "$2" "$3$4-1" "$5" "$6$7-1" "$8}' filename

答案 3 :(得分:0)

使用下面的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

会做的伎俩