sedを使用した大文字/小文字のペアの一致

sedを使用した大文字/小文字のペアの一致

sedパターンに合ったパターンを書けますか?アミノ酸BBCCなど(つまり、大文字が与えられたら、その小文字と一致する必要があります)すべての可能性を列挙しないで?

答え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(小文字バージョン。xxxXxx([[:upper:]](.)\2X

これは、分解された形式の文字には適用されません。たとえば、ÉEの後に次が来ると鋭いアクセントと組み合わせる。この問題を解決するには、代わりにperlgraphem\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場合は、まだ一致しませんが、とにかくそうです。

答え2

使用する場合結合する吹くまたはジッシュ、小さなものを使ってもいいメタプログラム、そう:

パスワード

>echo "AaBCAABbEE"| sed -E "s/`echo {A..Z}|sed -E 's/\w/&\L&/g;y/ /|/'`/%/g"
%BCAA%EE

これにより、シェル支柱の拡張(およびネスト)を使用してすべての組み合わせが効果的に作成されます。sed)、下図のように:

>echo {A..Z}|sed -E 's/\w/&\L&/g;y/ /|/'        
Aa|Bb|Cc|Dd|Ee|Ff|Gg|Hh|Ii|Jj|Kk|Ll|Mm|Nn|Oo|Pp|Qq|Rr|Ss|Tt|Uu|Vv|Ww|Xx|Yy|Zz

これを行う純粋なSed方法があるかもしれません。たとえば、複数の置換を連続して適用したり、予約済みスペースを使用してペアを1つずつ検索したりするなどの方法があります。

答え3

bashとsedの組み合わせ(この場合はsedを使用して文字を一致させて削除します):

$ word="Hey , This is AaBbCc and also Dd!"

$ search="H";search2=${search,,};sed "s/[$search$search2]//g" <<<"$word"
ey , Tis is AaBbCc and also Dd!

$ search="A";search2=${search,,};sed "s/[$search$search2]//g" <<<"$word"
Hey , This is BbCc nd lso Dd!

$ search="D";search2=${search,,};sed "s/[$search$search2]//g" <<<"$word"
Hey , This is AaBbCc an also !

var "search ="に大文字の検索文字を提供するだけです。

PS:小文字を検索する必要がある場合は、大文字に変換できます。${search^^}

関連情報