我正在寻找一个正则表达式,用空格群上相同数量的点替换一组空格,以满足一定的条件。
测试用例:用点
替换以非“空”行结尾的空格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! |
我觉得我应该使用前后条件,但我不知道如何。我使用sed
但perl
没问题。
答案 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! |
if /^\h*[*-]/
仅感兴趣的行^.*[^ ] (*SKIP)(*F)
此模式(从行的开头到最后一个非空格字符后跟空格字符)不会被更改
|
备用模式,这些模式将替换为.
perl -i -pe
进行就地编辑