替换条件下的字符

时间:2016-12-22 14:33:34

标签: regex perl sed

我正在寻找一个正则表达式,用空格群上相同数量的点替换一组空格,以满足一定的条件。

测试用例:用点

替换以非“空”行结尾的空格
TODO LIST:          |
==========          |
- item1             |
    * subitem1.1    |
    * subitem1.2    |
                    |
- item2             |
    * subitem2.1    |
    * subitem2.2    |
                    |
Some text... blah!  |

应转换为(请注意项目与...之间的空格):

TODO LIST:          |
==========          |
- item1 ............|
    * subitem1.1 ...|
    * subitem1.2 ...|
                    |
- item2 ............|
    * subitem2.1 ...|
    * subitem2.2 ...|
                    |
Some text... blah!  |

我觉得我应该使用前后条件,但我不知道如何。我使用sedperl没问题。

2 个答案:

答案 0 :(得分:4)

这会按照你的要求行事。没有必要将所有内容都填充到单个正则表达式中,因此我首先检查该行是否以可能的空格开头,后跟短划线-或星号*,然后将所有尾随空格转换为第一个使用表达式替换

进入相同数量的点.
use strict;
use warnings 'all';

while ( <DATA> ) {

    s/\S[ ]\K([ ]+)/ '.' x length $1 /e if /^\s*[-*]/;

    print;
}

__DATA__
TODO LIST:          |
==========          |
- item1             |
    * subitem1.1    |
    * subitem1.2    |
                    |
- item2             |
    * subitem2.1    |
    * subitem2.2    |
                    |
Some text... blah!  |

输出

TODO LIST:          |
==========          |
- item1 ............|
    * subitem1.1 ...|
    * subitem1.2 ...|
                    |
- item2 ............|
    * subitem2.1 ...|
    * subitem2.2 ...|
                    |
Some text... blah!  |

答案 1 :(得分:3)

另一种方法:

$ perl -pe 's/^.*[^ ] (*SKIP)(*F)| /./g if /^\h*[*-]/' ip.txt 
TODO LIST:          |
==========          |
- item1 ............|
    * subitem1.1 ...|
    * subitem1.2 ...|
                    |
- item2 ............|
    * subitem2.1 ...|
    * subitem2.2 ...|
                    |
Some text... blah!  |