sed `y` 명령을 일치하는 텍스트에만 적용할 수 있는지 여부(전체 줄 대신)

sed `y` 명령을 일치하는 텍스트에만 적용할 수 있는지 여부(전체 줄 대신)

이 글을 쓰고 나면답변, 나는 sed y//명령이 전체 라인이 아닌 일치하는 항목에만 적용되도록 할 수 있는지 알아보기 위해 인터넷 검색을 했습니다. 관련 내용을 찾을 수 없습니다.

$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii

즉 , 검색어(clayii)가 입력줄에 있는 여러 단어 중 하나일 경우 y//명령이 적용되도록 하고 싶습니다.오직줄의 나머지 부분 대신 해당 단어를 사용하세요.

즉, 나는 이것을 원하지 않습니다:

$ echo can sed ignore everything but the matching word - clayii | 
    sed -e '/clayii/ y/clayk/kieio/'
ken sed ignore everithing but the metkhing word - kieiii

가능합니까 sed? 아니면 다음과 같이 더 강력한 것을 사용해야 합니까 perl?

답변1

아니요, y명령은 패턴 공간에서 일치하는 모든 문자에 적용됩니다. POSIX에 따르면sed문서(강조):

[2주소]와이/문자열 1/문자열 2/
             바꾸다모두에 있는 문자의 발생 횟수문자열 1
             해당 문자와 ​​함께문자열 2.

운영 체제/BSDman페이지:

[2주소]y/문자열 1/문자열 2/
             바꾸다모두에 있는 문자의 발생 횟수문자열 1패턴으로
             공백 및 해당 문자문자열 2.

그리고GNU sed info페이지:

예/소스 캐릭터/대상 캐릭터/
             음역어느다음 문자 중 하나와 일치하는 패턴 공간의 문자
             이것소스 캐릭터해당 문자와 ​​함께대상 캐릭터.

물론 보류 버퍼를 사용하여 현재 패턴 공간을 저장한 다음 일치하는 항목만 유지하고 패턴 공간을 음역 및 복원하여 초기 일치 항목을 결과로 바꿀 수 있습니다.

sed 'y/words/evles/' <<<'words whispered by the drows'

그리고

sed 'h;s/.*\(drows\).*/\1/;y/words/evles/;G;s/\(.*\)\n\(.*\)drows\(.*\)/\2\1\3/' <<<'words whispered by the drows'

그러나 패턴/요구 사항을 추가하기 시작하면 상황이 복잡해집니다.

답변2

진주:perl -pe 's{(clayii)}{ ($new=$1) =~ tr/clayk/kieio/; $new }e' file

답변3

작동할 수 있을 것 같습니다. 일종의 입주/퇴거 작업만 수행하면 됩니다.

echo can ccccc ccccccccclayii sed clay ignore \
     every cclayii thing but the matching word\
     - cclayiicclayii |
sed     -e'y/ /\n/' \
-eh     -e's/\(cclayii\)\1*/ & /g;x;s// /g;s/^/ /' \
-ex     -e's//./;s/\([^ ]* *\)\{2\}/\1 /g;s/^/ /'  \
        -e'y/clayk/kieio/;G;t$' -e:$  \
        -e'/^ \n /{s///;y/ \n/\n /;}' \
-et     -e's/^ *\([^ ]*\) \(.* \n [^ ]*\) /\2\1/;t$'

can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii

…하지만 쉽지는 않습니다.


그러나 대부분의 복잡한 문제와 마찬가지로방법두 가지를 사용하면 sed더 쉽습니다 .

echo can ccccc ccccccccclayii sed clay ignore \
     every cclayii thing but the matching word\
     - cclayiicclayii |
sed -e's/\(cclayii\)\1*/\n&\n /g;G;s/^/ /'|
sed -e'/^ /!y/clayk/kieio/;/./{H;d;}' \
    -e'x;s/\n \{0,1\}//g'

can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii

관련 정보