0

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

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

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

由于我不会深入讨论的原因,相对于我迄今为止使用的另一个编号方案,每棵树的编号都是 N+1。

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

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

(使用 Ubuntu 12.02,几乎什么都可以。)

4

4 回答 4

4

使用 perl

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

输出

##################################### topd Tree0 - Tree13 #######################################
于 2016-07-13T10:15:18.103 回答
1

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

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

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

perl -pe 's/(?<=Tree)(\d+)/$1 - 1/ge'
于 2016-07-13T10:12:07.387 回答
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
于 2016-07-13T10:29:19.980 回答
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

会成功的

于 2016-07-13T10:59:52.583 回答