Regex 替换条件下的字符

Regex 替换条件下的字符,regex,perl,sed,Regex,Perl,Sed,我在寻找一个正则表达式,用满足一定条件的空间组上相同数量的点来替换一组空间 测试用例:用点替换非“空”行结尾的空格 TODO LIST: | ========== | - item1 | * subitem1.1 | * subitem1.2 | | - item2 | * subitem2.1 | * subitem2.2

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

测试用例:用点替换非“空”行结尾的空格

TODO LIST:          |
==========          |
- item1             |
    * subitem1.1    |
    * subitem1.2    |
                    |
- item2             |
    * subitem2.1    |
    * subitem2.2    |
                    |
Some text... blah!  |
应转换为(请注意项目和
)之间的空格):


我觉得我应该使用前置和后置条件,但我不知道如何使用。我使用的是
sed
,但是
perl
就可以了。

这将按照您的要求执行。没有必要将所有内容都塞进一个正则表达式中,因此我首先检查行是否以可能的空格开头,后跟破折号
-
或星号
*
,然后使用表达式替换将除第一个空格之外的所有尾随空格转换为相同数量的点

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!  |
另一种方法是:

$ 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*[*-]/
    仅限感兴趣的行
  • ^.[^](*跳过)(*F)
    此模式(从行首到最后一个非空格字符,后跟空格字符)不会更改
    • 进一步阅读:及
  • |
    备用模式,这些模式将替换为
  • 使用
    perl-i-pe
    进行就地编辑

所以只应考虑以
-
*
开头的行?管道字符
|
真的在文件中吗?@Sundeep没错@是的,有两个空格的线,比如«*两个空格失效|»失效。如果已知输入没有两个空格,则这可能不是问题。一个更复杂的正则表达式将匹配OP所述的标准:
s{[-*].\s\K(\s+)\\}{q{.}x长度($1)@shawnhcorey:我不明白你的意思。您的示例在
fail
和管道之间只有一个空格,作为空格保留。如果有两个空格,那么第二个空格将被改为一个点。在“两”和“空格”之间以及在“空格”和“失败”之间有两个空格。@shawnhcorey:啊,好的。它们不在注释中,该注释包含
如\xAB*两个空格fail | \xBB fails
。您应该使用反勾号来描绘注释中的空格敏感文本。我故意这样写代码,因为这是一种选择,要么在文本结尾前留出多个空格,要么写一些不太容易理解的东西。@Sundeep是的,但它有很多回溯。这是不必要的神秘。很少有人理解这是如何工作的,甚至他们也需要几秒钟才能理解它的目的。欢迎你探索语言的各个角落,如果你想成为一名专业人士,那么这是必不可少的,但是没有理由把你对新发现的喜悦强加给那些试图编写可维护代码的人。我很确定OP@YSC不理解它,如果他们愿意,也无法修复它,更不用说他们的同事了,他们可能会被难倒。这需要大量的上下文评论来解释其目的。
TODO LIST:          |
==========          |
- item1 ............|
    * subitem1.1 ...|
    * subitem1.2 ...|
                    |
- item2 ............|
    * subitem2.1 ...|
    * subitem2.2 ...|
                    |
Some text... blah!  |
$ 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!  |