CamelWords의 단어를 바꾸고 싶습니다. 예를 들어 텍스트에서 "foo"를 "bar"로 바꾸십시오.
ifootest // not replace this foo
Ifootest // not replace this foo
IfooTest // << replace this foo
I foo Test // << replace this foo
I_foo_Test // << replace this foo
또는 텍스트에서 "Foo"를 "Bar"로 바꾸십시오.
IFootest // not replace
IFooTest // not replace
iFooTest // replace
i Foo Test //replace
I_Foo_Test // replace
규칙은 내가 단어를 입력하는 것입니다.
단어의 첫 번째 문자 앞에 오는 문자는 단어의 첫 번째 문자와 대소문자가 같아서는 안 됩니다.
단어의 마지막 문자 뒤에 오는 문자는 단어의 마지막 문자와 대소문자가 같아서는 안 됩니다.
답변1
다음을 수행할 수 있습니다.
perl -pe 's/(?<![[:lower:]])foo(?![[:lower:]])/bar/g'
foo
즉, 앞뒤에 소문자가 없는 인스턴스를 바꾸려면 음의 뒤돌아보기 및 미리보기 연산자를 사용하십시오.
이는 ASCII 텍스트에서만 작동합니다. 로캘의 문자 집합을 사용하여 옵션을 추가할 수 있습니다 -Mopen=locale
. 또는 -C
UTF-8 텍스트를 처리하기 위한 것입니다.
이는 첫 번째 또는 마지막 문자가 대문자인 Foo
// 와 같은 foO
단어에 대해 조정되어야 합니다.FoO
모든 단어에 대해 작동하게 하려면 다음을 수행할 수 있습니다.
WORD=FoO REPL=bar perl -pe 's{
(?(?=[[:lower:]]) # if following character is lowercase
(?<![[:lower:]])| # preceding must not be lower
(?<![[:upper:]]) # otherwise preceding must not be upper
) \Q$ENV{WORD}\E
(?(?<=[[:lower:]]) # if preceding character is lowercase
(?![[:lower:]])| # following must not be lower
(?![[:upper:]]) # otherwise following must not be upper
)}{$ENV{REPL}}gx'
답변2
이는 아마도 약 1,000,000배 더 느릴 것입니다. perl
그러나 여기에 awk
도전하기 위한 버전이 있습니다. 하지만 어쨌든
awk -v gzin="Foo" -v gzout="Bar" '
BEGIN {FS=gzin;
cb=(substr(gzin,1,1)~/[a-z]/)?"[a-z]$":"[A-Z]$"
ca=(substr(gzin,length(gzin)-1,1)~/[a-z]/)?"^[a-z]":"^[A-Z]"
}
{printf $1; for (f=2; f<=NF; f++) printf ("%s%s", ((($(f-1) ~ cb) || ( $(f) ~ ca ))?gzin:gzout), $f) ;
print ""}' file
댓글이랑도 일치하네
ifootest // not replace this foo
Ifootest // not replace this foo
IbarTest // << replace this bar
I bar Test // << replace this bar
I_bar_Test // << replace this bar
그리고-v gzin="Foo" -v gzout="Bar"
IFootest // not replace
IFooTest // not replace
iBarTest // replace
i Bar Test //replace
I_Bar_Test // replace
송곳
awk -v gzin="Foo" -v gzout="Bar" '
일치 항목 gzin
과 대체 항목을 gzout
변수로 로드
BEGIN {FS=gzin;
분할하다gzin
cb=(substr(gzin,1,1)~/[a-z]/)?"[a-z]$":"[A-Z]$"
첫 번째 문자의 대소문자를 테스트 gzin
하고 이에 일치하도록 정규식을 설정합니다.
ca=(substr(gzin,length(gzin)-1,1)~/[a-z]/)?"^[a-z]":"^[A-Z]"
마지막 문자와 동일
}
{printf $1; for (f=2; f<=NF; f++) printf ("%s%s", ((($(f-1) ~ cb) || ( $(f) ~ ca ))?gzin:gzout), $f) ;
이전 필드와 현재 필드의 필드를 반복적으로 테스트하고 그 사이에 적절한 값을 배치합니다.
print ""}' file
각 줄 끝
폴리스티렌나 뇌를 다친 것 같아