2016-07-15 3 views
2

私は多くの状況のある行の長いリストを持っています。 最初の同じ単語(スペースの前の最初の文字列)を持つ行は残りますが、残りは異なります。 一意の最初の文字列を1行だけ保持する必要があります。最初の文字列と一致する行を削除する正規表現ですか?

john jane 
john 123 
john jim jane 
jane john 
jane 123 
jane 456 
jim 
jim 1 

この結果ました:だから、

john jane 
jane john 
jim 

を行の最初の単語が一致している場合は、1行以外のすべてを削除します。

は私が

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

この正規表現の例のように、同じ行を削除しないで、すべての重複行を削除しますが、上記の例のような行を残すことができます。 これを解決する正規表現またはメモ帳マクロがある場合は?

+0

ない最高のメモ帳++ (同じ最初の単語との仮定の線が連続している)でメモ帳++: '^((\ w + \ b)。*)\ r?\ n \ 2. *' - > '$ 1'を実行し、*すべて置き換える*を複数回打ってください。 –

+0

最初の「単語」が同じ行は常に連続していますか?また、関連する回答が必要な場合は、anubhavaの質問にお答えください。 –

答えて

2

検索:^(\S++).*\K(?:\R\1(?:\h.*|$))+
交換:何

demo

パターンの詳細:

^    # start of the line 
(\S++)  # the first "word" (all that isn't a whitespace) captured in group 1 
.*   # all characters until the end of the line 
\K   # remove characters matched before from the match result 
(?: 
    \R  # a newline 
    \1  # reference to the capture group 1 (same first word) 
    (?: 
     \h.* # a horizontal whitespace 
     |  # OR 
     $  # the end of the line 
    ) 
)+   # repeat one or more times 
+0

私のファイルのために働いています。メモ帳++は非常に大きなファイルを扱うことができないので、ultraeditでも使えます。 – Jim8645

+1

@ Jim8645:unix/linuxを使用している場合、sp asic awkのアプローチは、大容量のファイルではメモリ内のすべてのファイルをロードする必要がないので、注意が必要です。 –

0

を:

s/^((\w+).*)\n(?:(?:\2.*\n)*)/$1/gm 

あなたはこれでそれを試してみることができます。

#!/bin/usr/perl 

use warnings; 
use strict; 

my $file = "john jane 
john 123 
john jim jane 
jane john 
jane 123 
jane 456 
jim 
jim 1 
"; 

$file =~ s/^((\w+).*)\n(?:(?:\2.*\n)*)/$1\n/gm; 

print $file; 
関連する問題