搜索模式。将其放入缓冲区并使用正则表达式(Notepad++ 或 cygwin Shell)或 JSFiddle 进行排序

Search for pattern. Put it in buffer and do sorting using regex ( Notepad++ or cygwin Shell ) or JSFiddle

我想识别特定模式并将整行移动到文件的特定部分,从而重新安排文件内容(如您所说)。我更喜欢 notepad++ 解决方案,但如果您认为它太复杂,那么 cygwin shell ( awk )JSfiddle 也可以 我将用下面的例子来说明我的观点

    I have a pattern that is 
"col<variable space>stat<variable space>col ( axx,bvb,ccc) on mr.dan"  (<some word> confidence)
e.g. 
"col  stat  col ( a123,b6949,c4433) on Mr.Randy"  (Low confidence) 
"col         stat       col     ( a1fddf23, b6ff949,c4433 ) on    John.Doe  "  (Low confidence) 
"col     stat   col     ( ax ) on    John.Dane  "  (Ok confidence) 
"col stat col ( axdf,fsdds ) on    Jane.Dame "  (  Fair confidence ) 

它应该做什么

col\s+(\s*word1\s*,\s*word2\s*,\s*wordN\s*)\s*on\s*word.word\s*


上面的模式需要重新排列,使一个单词 col ( word) 排在最前面,然后是两个单词 col ( word1, word2) 等等,按照 [=22= 中单词数的升序排列] 表达
所以上面的输出应该是

col     stat   col     ( ax ) on    John.Dane  ;    # 1 word in col (word) expr 
col stat col ( axdf,fsdds ) on    Jane.Dame ;     # 2 words in col (word) expr 
col         stat       col     ( a1fddf23, b6ff949,c4433 ) on    John.Doe  ;    ; # 3 words in col (word) expr 
col  stat  col ( a123,b6949,c4433) on Mr.Randy; 

我做了什么
我可以使用完成第一部分 "\s*\((\s*(\w+)*\s*Confidence\)) 替换为 ;

我需要有关第二部分 col ( word) 表达式重新排列的帮助。
Notepad++ 的逻辑伪代码是前两个将每个列表达式中的单词列表隔离在单独的缓冲区中。接下来你计算每个缓冲区中的单词数,然后排列缓冲区。根据您排列表达式的缓冲区排列。
也开放给 JsFiddleShellscript regex / awk

这不能用 Notepad++ 完成,我建议使用脚本,这里是执行此工作的 Perl 脚本示例。

整个文件在内存中读取,如果文件很大会出问题

#!/usr/bin/perl
use Modern::Perl;

# Read input file in an array
my $file_in = 'file.txt';
open my $fh, '<', $file_in or die "unable to open '$file_in': $!";
my @lines = <$fh>;

# Replace last quote until end of line with semicolon and remove quotes
my @unsorted = map { s/"[^"]*$/;/; s/"//g; $_ } @lines; 

# use Schartzian transform for sorting
my @sorted = 
    # remove the number of words
    map  { $_->[0] }
    # sort on number of words
    sort { $a->[1] <=> $b->[1] }
    # Add number of words
    map  { 
        # list of words inside parenthesis
        my ($words) = $_ =~ /\(([^)]+)\)/;
        # split to have number of words
        my @w = split',', $words;
        # add this number as second element in array
        [$_, scalar @w] 
    }
    @unsorted;

# Write into output file
my $file_out = 'file_out.txt';
open my $fh_out, '>', $file_out or die "unable to open '$file_out': $!";
say $fh_out $_ for @sorted;

输出文件:

col     stat   col     ( ax ) on    John.Dane  ;
col stat col ( axdf,fsdds ) on    Jane.Dame ;
col  stat  col ( a123,b6949,c4433) on Mr.Randy;
col         stat       col     ( a1fddf23, b6ff949,c4433 ) on    John.Doe  ;