sed 단일 문자를 전체 단어로 바꾸려면 BSD sed?

sed 단일 문자를 전체 단어로 바꾸려면 BSD sed?

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.\nsed

관련 정보