web-dev-qa-db-ja.com

sedを使用した大文字から小文字

次のパターンを変更したいと思います。

getFoo_Bar

に:

getFoo_bar

(下のbに注意してください)

Fooもbarも知らないので、置換パターンは何ですか?

書き始めました

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1

しかし、私は立ち往生しています:「\ 2小文字」を書きたいのですが、どうすればよいですか?

たぶんsedは適応されていませんか?

21
cadrian
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g

テスト:

$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g'
getFoo_bar
25
strager

Sedを使用してgetFoo_BarをgetFoo_barに変更するには:

echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/'

大文字と小文字は次のように処理されます。

  • \Uすべてのテキストを右大文字にします。
  • \uは右大文字の最初の文字のみを作成します。
  • \Lすべてのテキストを右小文字にします。
  • \l右小文字の最初の文字のみを作成します。 (小文字のLに注意してください)

この例は、テキストの1つのチャンクを変更することに基づいた、パターンマッチングの1つの方法にすぎません。この例を使用すると、getFoo_BArはgetFoo_bArに変換されますが、Aは変更されていないことに注意してください。

34
Matt Thomas

やや短い:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/'
7
kalyanji

私が思いつくことができる最短:

echo getFoo_Bar | sed 's/_./\L&/'
6
Dušan

これにはPerlを使用できます。

Perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/'

\ lはここでのトリックです。

sedは、一致するグループに対して大文字/小文字を使用しません。

1
brian-brazil

アンダースコアの直後にすべてを小文字で記述したい場合は、これでうまくいくでしょう。

echo getFoo_Bar | gawk -F_ '{print tolower($2)}'
0
user2923416
0
Nik