同様の作業を行うには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'