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
/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'
これはおそらくPerl
よりも約1,000,000倍遅いですが、ここでは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
各行を終了
[〜#〜] ps [〜#〜]脳を痛めたと思います