テキスト行の単語内で文字を並べ替えることは可能ですか?

テキスト行の単語内で文字を並べ替えることは可能ですか?

したがって、すべての可能な状況を正しく処理することを確認するために、いくつかの機能に対して実行したいテストコマンドでいっぱいのファイルがあります。しかし、重複したコマンドを使用することは意味がありません。ここにいくつかの例があります。

rap ,Xflg MIT X11           
rap ,XPBfl 'MITER'
rap ,Bflg share git-grep    
rap ,bfl X11
rap ,Bfl xzfgrep
rap ,Bf X11

...私の関数 "rap"はダッシュの代わりにカンマを使用して文字オプションの始まりを表示し、その後にいくつかの引数が続きます。これらのオプションの順序は重要ではありません。

rap ,Bf X11
rap ,fB X11

...全く同じコマンドです。もちろん、ファイルから重複した行を削除するのは簡単ですが、上記の問題を避けるために私が望むのは、上記の結果になるようにオプションをアルファベット順に並べ替えることです。

rap ,Bf X11
rap ,Bf X11

...その後、重複したアイテムを削除できます。英雄主義なしにそのようなことを達成することは可能ですか?これは、オプションのリストをソートするのではなく、オプション自体をソートすることです。

ベストアンサー1

別のperl変形:

$ perl -pe 's{^rap ,\K\S+}{join "", sort split //, $&}e' file
rap ,Xfgl MIT X11
rap ,BPXfl 'MITER'
rap ,Bfgl share git-grep
rap ,bfl X11
rap ,Bfl xzfgrep
rap ,Bf X11

'x'大文字の前に小文字を追加する必要がある場合は、ASCIIでis 'X' ^ 32(および'X'is 'x' ^ 32)という事実を利用できます。

$ perl -pe 's{^rap ,\K\S+}{join "", sort {(ord($a)^32) <=> (ord($b)^32)} split //, $&}e' file
rap ,fglX MIT X11
rap ,flBPX 'MITER'
rap ,fglB share git-grep
rap ,bfl X11
rap ,flB xzfgrep
rap ,fB X11

おすすめ記事