【问题标题】:sed replace number with number-1sed 用 number-1 替换数字
【发布时间】:2016-11-15 20:33:18
【问题描述】:

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

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

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

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

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

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

(使用 Ubuntu 12.02,所以几乎一切正常。)

【问题讨论】:

  • 如果您的列是可预测的,awk 知道数学...
  • 是的,你没有用 sed 做这个。
  • 我认为它们是(有相同的 ### 空间、topd.... 等等,尽管这对我来说似乎不如找到字符串那么健壮?
  • sed 不会做数学。你应该看看 Perl。

标签: bash replace sed expression-evaluation


【解决方案1】:

你可以试试这个;

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

【讨论】:

  • 一个单一的 awk 解决方案是可能的。这看起来两个seds 和awk 似乎是多余的
【解决方案2】:

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

会成功的

【讨论】:

    【解决方案3】:

    使用 perl

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

    输出

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

    【讨论】:

    • 使用 perl 似乎是最简单的解决方案。
    • 很好,我最终尝试了这个,因此被接受为答案。为了提供更多信息,您能否详细说明哪些语法在做什么?我可以挑选元素,但不是全部。
    • @JoeHealey \K 导致替换只影响右侧,因此只有数字 \d+ 匹配。 $&amp; 是匹配的字符串。 g 是全局的,尽可能多地匹配。 e 评估正则表达式的替换部分,就像它是一个命令一样。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 你也需要g标志,而不需要#
    • @123 是的,我没有注意到这两个数字都应该递减,编辑谢谢!
    猜你喜欢
    • 2012-10-20
    • 2021-09-23
    • 2019-01-10
    • 2012-09-21
    • 2020-04-02
    • 1970-01-01
    • 2019-07-29
    • 2011-10-28
    • 2012-06-24
    相关资源
    最近更新 更多