camelWords의 단어를 대체하는 정규식

camelWords의 단어를 대체하는 정규식

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. 또는 -CUTF-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

각 줄 끝

폴리스티렌나 뇌를 다친 것 같아

관련 정보