sed
パターンに合ったパターンを書けますか?アミノ酸、BB、CCなど(つまり、大文字が与えられたら、その小文字と一致する必要があります)すべての可能性を列挙しないで?
ベストアンサー1
を使用すると、perl
次のことができます。
$ echo 'fooÉébAar' | perl -Mopen=locale -pe 's/([[:upper:]])(??{lc$^N})/<$&>/g'
foo<Éé>b<Aa>r
(??{code})
一致させる正規表現を動的に指定できる特別なPerl演算子を使用します。これは最後のキャプチャグループの小文字バージョンですlc$^N
。$^N
GNUを使用すると、sed
次のことができます。
$ echo 'fooÉébAar' | sed -Ee 's/./&\L&/g;s/([[:upper:]](.)\2.)/<<\1>>/g;s/(.)./\1/g'
foo<Éé>b<Aa>r
アイデアは、入力に各文字の小文字バージョンをX
最初に追加することですXx
(小文字バージョン。x
xx
Xxx
([[:upper:]](.)\2
X
これは、分解された形式の文字には適用されません。たとえば、É
式E
の後に次が来ると鋭いアクセントと組み合わせる。この問題を解決するには、代わりにperl
graphem\X
クラスタ正規表現演算子を使用できます。
$ printf 'E\u0301\u0302\u00e9\u0302 \u00c9e\u301 foo Ee\u301\n' |
perl -Mopen=locale -MUnicode::Normalize -pe '
s/((?=[[:upper:]])\X)(?{$c1 = $^N})(\X)(??{
NFD(lc$c1) eq NFD($^N) ? qr{} : qr{(?!)}})/<$&>/g'
<É̂é̂> <Éé> foo Eé
上記を使用してください標準化された形式(NFD
)は、文字素クラスタが文字レベルで常に同じ方法で表示されるようにします。
単一の(印刷的に連結された)文字(U + FB03)のようなFffi
場合は、まだ一致しませんが、ffi
とにかくそうです。