Sed:テキスト内のすべての単語の最初の単語以外のすべての単語の繰り返しを修正します。

Sed:テキスト内のすべての単語の最初の単語以外のすべての単語の繰り返しを修正します。

同様の作業を行うにはsedを使用する必要がありますか?

qq    ab xyz     ab qq aa ab 

になる:

qq    ab xyz     +ab+ +qq+ aa +ab+

ベストアンサー1

入力に<>または+文字がすべて含まれていない場合は、次のことができます。

sed '
  s/[[:alnum:]]\{1,\}/<&>/g;:1
  s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1
  s/[<>]//g'

次の場合、いつでもこの問題を回避できます。

sed '
  s/:/::/g;s/</:{/g;s/>/:}/g
  s/[[:alnum:]]\{1,\}/<&>/g;:1
  s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1
  s/[<>]//g
  s/:}/>/g;s/:{/</g;s/::/:/g'

これは、各行で独立してこれを実行すると仮定します。フルファイルに対してこれを行うには、まずファイル全体をメモリにロードする必要があります(一部のsed実装にはサイズ制限があります)。

sed '
  :2
  $!{N;b2
  }
  s/:/::/g;s/</:{/g;s/>/:}/g
  s/[[:alnum:]]\{1,\}/<&>/g;:1
  s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1
  s/[<>]//g
  s/:}/>/g;s/:{/</g;s/::/:/g'

ただし、これは非常に非効率的で、使いやすくなりますperl

perl -pe 's/\w+/$seen{$&}++ ? "+$&+" : $&/ge'

ラインベース:

perl -pe 'my %seen;s/\w+/$seen{$&}++ ? "+$&+" : $&/ge'

おすすめ記事