如果条件适合,则删除第58个(或最后一个)字符

时间:2014-07-31 00:01:02

标签: regex perl sed

以下是非常大的文件的一部分:

 AX1       -0.7766512832    0.5148273234    4.2786094015 >
            1.7946619816    0.7753532457    1.8759964126    0.3364947702 >
            0.9685478959    0.3507513619    0.3894364805    0.7390333869 >
            0.3061019863
 AX9       -2.4577177384   -0.4989707852   -1.3388532333 >
            2.1316147211    0.6123791026    2.7070013136    0.4139841780 >
           -0.1511381820    0.3962115748    0.2241446997   -0.4274101066 >
            0.4097737023
 AX20      -1.9584498342   -0.3207285057    0.5492832625 >
            5.8330021421    0.6706829149    2.3033089678    0.5822925912 >
            2.6239469531    0.5245128606    0.8995560125    1.4869098981 >
            0.0473609746

我必须删除>线条末尾的字符以图案'开头。 AX' (空白+ AX)。我可以在这里识别出两种模式:1。如果行以'开头AX',然后删除最后一个字符;或2.如果一行中的第58个字符是'>',则删除该'>'。所以它看起来像:

 AX1       -0.7766512832    0.5148273234    4.2786094015
            1.7946619816    0.7753532457    1.8759964126    0.3364947702 >
            0.9685478959    0.3507513619    0.3894364805    0.7390333869 >
            0.3061019863
 AX9       -2.4577177384   -0.4989707852   -1.3388532333
            2.1316147211    0.6123791026    2.7070013136    0.4139841780 >
           -0.1511381820    0.3962115748    0.2241446997   -0.4274101066 >
            0.4097737023
 AX20      -1.9584498342   -0.3207285057    0.5492832625
            5.8330021421    0.6706829149    2.3033089678    0.5822925912 >
            2.6239469531    0.5245128606    0.8995560125    1.4869098981 >
            0.0473609746

你能帮助我使用sed或perl单行程来完成这项工作吗?谢谢!

1 个答案:

答案 0 :(得分:0)

Perl One-Liner

perl -pe 's/^ AX.*\K>$//mg' yourfile

为安全起见,我没有给你选择直接在文件中替换它,所以你可以先测试它。但是,如果要直接替换文件的内容,请使用-i -pe或进行备份:

perl -i'.bak' -pe 's/^ AX.*\K>$//mg' yourfile

<强>解释

  • m标志启用了多行模式,允许^$在每一行匹配
  • ^锚点断言我们位于字符串的开头
  • AX匹配文字
  • .*让我们走到行尾
  • \K告诉引擎放弃与其返回的最终匹配项目匹配的内容
  • >匹配您要替换的字符
  • $锚点断言我们位于字符串的末尾