sed를 사용하여 대문자/소문자 쌍 일치

sed를 사용하여 대문자/소문자 쌍 일치

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( 소문자 버전.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 방법이 있을 수도 있습니다. 예를 들어 여러 교체를 연속적으로 적용하거나 예약된 공간을 사용하여 쌍을 하나씩 검색하는 등의 방법이 있습니다.

답변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="에 대문자 검색 문자를 제공하기만 하면 됩니다.

추신: 소문자를 검색해야 하는 경우 대문자로 변환할 수 있습니다.${search^^}

관련 정보