webdevqa.jp.net

テキスト内の繰り返される単語を検索する

最も一般的なタイプミスの1つは、ここに示すように、同じ単語を2回繰り返すことです。テキストファイル内の繰り返される単語をすべて削除する自動手順が必要です。これは、現代のエディターやスペルチェッカーにとって奇妙な機能ではないはずです。たとえば、MSWordが数年前にこの機能を導入したことを覚えています。どうやら、私のOSのデフォルトのスペルチェック(hun-spell)は、辞書にない単語しか見つけられないため、これを行うことができません。

Linux用の特定のテキストエディターエディター(pluma/gedit2またはSublime-text)に有効なソリューションと、bashスクリプトに基づくソリューションがあれば問題ありません。

4
altroware

GNU grep:

echo 'Hi! Hi, same Word twice twice, as as here here! ! ,123 123 need' |  grep -Eo '(\b.+) \1\b'

出力:

 2回
 as 
ここ
 123123 

オプション

-E:解釈(\b.+) \1\b拡張正規表現として。

-o:一致する行の一致する(空でない)部分のみを印刷し、そのような各部分を別々の出力行に出力します。

正規表現

\b:幅がゼロのWord境界です。

.+:1つ以上の文字に一致します。

\1:括弧()キャプチャグループをマークして\1は、ここで最初のキャプチャグループの値を使用することを意味します。


参照: スタックオーバーフロー正規表現FAQ

12
Cyrus

これはあなたが望むもののように聞こえます(すべてのUNIXボックスの任意のシェルで任意のawkを使用):

$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
{
    head = prev = ""
    tail = $0
    while ( match(tail,/[[:alpha:]]+/) ) {
        Word = substr(tail,RSTART,RLENGTH)
        head = head substr(tail,1,RSTART-1) (Word == prev ? "" : Word)
        tail = substr(tail,RSTART+RLENGTH)
        prev = Word
    }
    print head tail
}

$ cat file
the quick quick brown
fox jumped jumped
jumped over the lazy
lazy dogs back

$ awk -f tst.awk file
the quick  brown
fox jumped
 over the lazy
 dogs back

ただし、句読点、大文字の違い、複数の段落、文の最初/最後の重複した単語、その他のさまざまな重要なケースが示されているなど、より真に代表的なサンプル入力と期待される出力を使用して新しい質問をしてください。

2
Ed Morton

しつこく、私は考えているでしょう:

use strict;
use warnings;

local $/;

my $Slurp = <DATA>;
$Slurp =~ s/\b(\w+)\W\1/$1/go;
print $Slurp;

__DATA__
Hi! Hi, same same? Word twice twice, as as here here! ! ,123 123 need
need as here 

ただし、注意してください。パターンマッチングの多くは線指向であるため、線の境界を越える場合は注意が必要です。その場合を除外できれば、一度に1行ずつ解析できるため、作業が簡単になります。私はそれをしていないので、ファイル全体をメモリに読み込むことになります。

1
Sobrique