【问题标题】:Keep all lines of a list with identical beginning (Notepad++)保持列表的所有行以相同的开头(记事本++)
【发布时间】:2017-10-15 00:35:22
【问题描述】:

从列表中,如何保留所有出现的那些行,仅在其他行中出现“第一部分或开头”(从行首到 ^ 字符定义) ? (列表中的线条模式:beginning-of-line^rest_of_line_012345)

^后面的字符类型、长度等无关(但需要保留)。每行只有一 (1) 个 ^ 字符。确定身份的“开始”字符串必须出现在其他行中的相同(类似)位置(即,从行首到^,并且必须完全匹配)。 (行中包含对正则表达式有影响的字符,例如\/()*.,因此需要对这些字符进行简要转义。)

例如:原始列表:

abc^123
0xyz^xxx
aaa-123^123
aaa-12^0xyz
0xyz^098
00xyz^098
0xyz^x111xx

保留所有出现的第一部分相同的行:

0xyz^xxx
0xyz^098
0xyz^x111xx

@Lars Fischer((.*)\R(\2\R?)+)*\K.*(预排序后)编写的这个优雅的脚本保留了所有出现的重复行,但它考虑了整行(它被设计为这样做)。 p>

在这个 Q 中,我正在寻找一种解决方案,它只考虑行的“开头”以查看它是否出现多次,如果是,则保留整行。有什么指导吗?

【问题讨论】:

  • 在您的问题中只有一种模式。是否还询问是否存在多种模式?请使用更多示例数据进行说明。
  • 我想知道,如果可以使用 awkperlpython 以不那么具有挑战性的方式来完成,为什么还要使用纯正则表达式方法将其推向边缘?
  • 重新“模式”。在我的例子中,每行总是有一个 (1) 单个唯一字符 (^) 作为行首和其余行的分隔符。关于 "regex" 方法:这将是最简单的,因为我经常使用 Notepad++。 perl 脚本将是我也可以接受的解决方案。

标签: list sorting duplicates notepad++


【解决方案1】:

注意:在此解决方案中,使用字符 # 和 % 是基于假设这些字符不会出现在文件开头的任何位置。如果您不是这种情况,只需使用您知道不会出现在文件中任何位置的不同模式,例如##### 和 %%%%%。

首先使用 Notepad++ 按字典顺序对文件进行排序,方法是转到 Edit -> Line Operations -> Sort Lines Lexicographically Ascending

执行正则表达式查找和替换(取消选中“。匹配换行符”框):

找到什么:

^(.*?)\^[^\r\n]+[\r\n]+(\1\^.*?[\r\n]+)*\1\^.*?$

替换为:

#$&%

现在执行另一个正则表达式查找和替换(选中“。匹配换行符”框):

找到什么:

%.*?#

替换为:

\r\n

最后,执行最后一个正则表达式 Find-and-Replace(选中“.matches newline”框):

找到什么:

^.*?#|%.*

什么都没有。

【讨论】:

    【解决方案2】:

    您在 cmets 中说过 perl 脚本适合您。

    #!/usr/bin/perl
    use Modern::Perl;
    
    my %values;
    my $file = 'path/to/file';
    open my $fh, '<', $file or die "unable to open '$file': $!";
    while(<$fh>) {
        chomp;
        # get the prefix value
        my ($prefix) = split('\^', $_);
        # push in array the whole line in hash with the prefix as key
        push @{$values{$prefix}}, $_;
    }
    foreach (keys %values) {
        # skip the prefix tat have only one line
        next if scalar @{$values{$_}} == 1;
        local $" = "\n";
        say "@{$values{$_}}";
    }
    

    输出:

    0xyz^xxx
    0xyz^098
    0xyz^x111xx
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2013-01-07
      • 2016-01-21
      • 2012-11-10
      • 2015-10-23
      相关资源
      最近更新 更多