이 글을 쓰고 나면답변, 나는 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