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
各行の終わり
ポリスチレン私は脳を傷つけたようです。