GNU 솔루션을 찾은 것 같지만 BSD sed
솔루션이 필요합니다.
내가 하고 싶은 것은 한 번에 전체 단어를 바꾸는 것입니다. 단어가 "clayii"이고 내 코드가 sed 's/c/k/g;s/l/i/g;s/a/e/g;s/y/i/g;s/k/o/g'
"kieii"를 생성할 것으로 예상하지만 분명한 이유로 "oieiii"을 생성합니다. 마지막 부분에서는 k
처음부터 검색하여 찾아내지만, 전체 단어를 검색하는 경우에는 절대 그렇게 하지 않습니다.
분명히 "clayii"는 항상 다를 것이므로 단일 문자를 대체하고 다시 시작하지 않기를 원합니다. 이미 첫 번째 문자를 대체한 n
다음 처음에서 발견하면 다시 시작해서는 안 됩니다. 따라서 교체된 콘텐츠는 감지될 수 있으면 기본적으로 무시됩니다.
해결책이 있나요?
답변1
y//
대신 (sed의 내장 tr 명령)을 사용할 수도 있습니다 s///
.
$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii
이 y//
명령은 일치하는 단어뿐만 아니라 전체 줄에서 계속 작동합니다.
답변2
BSD sed를 사용하면 다음을 사용할 수 있습니다.
sed "s/[[:<:]]clayii[[:>:]]/kieii/g" /path/to/file
답변3
반복할 수 있습니다:
echo here is a pat and a tern and a pattern |
sed -e'1{H;x;s/\(.\).*/\1pattern\1replace/;x;}' \
-eG -e'/\(.*\)\(.*\n\)\(\n\1\)\n/!{P;d;}' \
-e's//\3\2/;t-' \
-e:- -e's/\(\n\)\(.\)\(.*\n\)\(.\)/\4\1\3/;t-' \
-e's/\n//;P;d'
here is a pat and a tern and a replace
이렇게 하면 문자가 왼쪽에서 오른쪽으로 한 문자씩 대체됩니다. 각 교체에 대해 첫 번째 구분 문자를 교체되는 문자 오른쪽으로 이동합니다. 예상 교체를 l
반복하기 전에 ook 명령을 붙여 넣으면 t
무슨 뜻인지 알 수 있습니다 -e:-
.
here is a pat and a tern and a \npattern\nreplace$
here is a pat and a tern and a r\nattern\neplace$
here is a pat and a tern and a re\nttern\nplace$
here is a pat and a tern and a rep\ntern\nlace$
here is a pat and a tern and a repl\nern\nace$
here is a pat and a tern and a repla\nrn\nce$
here is a pat and a tern and a replac\nn\ne$
here is a pat and a tern and a replace\n\n$
here is a pat and a tern and a replace
당신이 정말로 어떤 종류의 번역 직업을 찾고 있다면, 당신도 그렇게 할 수 있습니다. 나는 이전에 다른 질문에 대한 응답으로 다음과 같이 썼습니다.
작동할 수 있을 것 같습니다. 일종의 입주/퇴거 작업만 수행하면 됩니다.
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
BSD의 경우 sed
오른쪽의 첫 번째 대체에서 이스케이프 문자 대신 리터럴 개행 문자를 사용해야 합니다 n
.\n
sed