Sed

正則表達式替換camelWords中的單詞

  • May 17, 2020

我想替換 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

規則是:如果我輸入一個單詞。

單詞第一個字元之前的字元不應與單詞的第一個字元大小寫相同。

單詞最後一個字元之後的字元不應與單詞最後一個字元大小寫相同。

您可以執行以下操作:

perl -pe 's/(?<![[:lower:]])foo(?![[:lower:]])/bar/g'

foo那就是使用否定的後向和前瞻運算符替換既不在小寫字母之前也不在小寫字母之後的實例。

這僅適用於 ASCII 文本。使用您的語言環境的字元集,您可以添加一個-Mopen=locale選項。或用於-C處理 UTF-8 文本。

這需要適應像Foo//這樣的第一個foOFoO最後一個字元是大寫字母的單詞。

要使其適用於任意單詞,您可以執行以下操作:

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'

引用自:https://unix.stackexchange.com/questions/587246