パターンマッチングから重複文字を除外

パターンマッチングから重複文字を除外

文字セットの文字を一度だけ一致させることができる正規表現はありますか?つまり、キャラクタが見つかるとセットから削除されます。

grepがこれを行うことができない場合、それを実行できる組み込みユーティリティはありますか?

例:

Characters to match only once:   spine

入力する:

spine
spines
spin
pine
seep 
spins

出力:

spine
spin
pine

編集する:
この出力を取得する方法はいくつかありますが(以下の例を参照)、一致させたいパターンごとにカスタムコマンドを作成せずにこれを達成する方法を探しています。

grep '[spine]' input_file | grep -v 's.*s' | ... | grep -v 'e.*e'

ベストアンサー1

そして一般的な表現数学的には可能ですが、正規表現のサイズはアルファベットのサイズに比べて指数関数的に増えて実用的ではありません。

否定を使用する簡単な方法があります。逆参照

grep '[spine]' | grep -Ev '([spine]).*\1'

最初grepは1つ以上を含む行を選択しeinps、2番目はgrep2つ以上を含む行を拒否します(たとえば、andは許可しますspinal tapが、orspendは許可しません)。foobarsee

おすすめ記事