正規表現のグループを小文字のバージョンに置き換えることができる正規表現の実装はありますか?
Perlでは、次のことができます。
_$string =~ s/(some_regex)/lc($1)/ge;
_
_/e
_オプションを使用すると、置換式が評価されるPerlコードとして解釈され、その戻り値が最終的な置換値として使用されます。 lc($x)
は、小文字のバージョンの_$x
_を返します。 (確かではありませんが、lc()
は最近のPerlバージョンで国際文字を正しく処理すると想定しています。)
_/g
_は、グローバルに一致することを意味します。単一の置換のみが必要な場合は、g
を省略します。
正規表現バージョンでサポートされている場合、POSIXシェルでのように\ Lを使用できます。
sed -r 's/(^.*)/\L\1/'
いくつかの回答は、\L
の使用に言及しています。ただし、\E
は、\L
を使用するかどうかについても知る価値があります。
\L
は、次の\U
または\E
までのすべてを小文字に変換します。 ...\E
は大文字と小文字の変換をオフにします。(出典: https://www.regular-expressions.info/replacecase.html )
したがって、次のような一部のファイル名の小文字部分に rename
を使用するとします。
artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
次のようなことができます:
rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
Perlには、
$string =~ tr/[A-Z]/[a-z]/;
ほとんどのRegex実装では、置換を行うときにコールバック関数を渡すことができるため、コールバックから小文字バージョンの一致を単純に返すことができます。