是否有任何正则表达式的实现允许用小写版本替换正则表达式中的组?
如果你的正则表达式版本支持它,你可以在POSIX shell中使用\ L,就像这样:
sed -r 's/(^.*)/\L\1/'
在Perl中,您可以:
$string =~ s/(some_regex)/lc($1)/ge;
该/e
选项使替换表达式被解释为要计算的Perl代码,其返回值用作最终替换值. lc($x)
返回小写版本$x
.(不确定,但我认为lc()
在最近的Perl版本中会正确处理国际字符.)
/g
意味着全球匹配.g
如果你只想要一次更换,请省略.
如果您使用的是SublimeText或TextMate 1之类的编辑器,那么您很有可能会使用它
\L$1
作为你的替代,其中$1
指的是正则表达式中你放括号的东西.例如2,这里是我用来在某些SQL中对字段名称进行下调的东西,在任何给定行的末尾将所有内容都放在'as'的右侧.首先是"查找"正则表达式:
(as|AS) ([A-Za-z_]+)\s*,$
然后是替换表达式:
$1 '\L$2',
如果您使用Vim(或者可能是gvim),那么您将需要使用\L\1
而不是\L$1
,但是还需要注意另一个皱纹:Vim会反转字面括号字符和转义括号字符之间的语法.因此,要指定要包含在替换("捕获")中的正则表达式的一部分,您将\(
在开头和\)
结尾使用.想想\
作为,而不是转义特殊字符,使其文字标记特殊字符的开头(如\s
,\w
,\b
等等).所以如果你不习惯它可能看起来很奇怪,但如果你以Vim的方式想到它,它实际上是完全合乎逻辑的.
\1
而不是$1
.尝试两者并查看编辑器使用的内容.
2我把这个正则表达式从我的历史中删除了.我总是在使用它们时调整regexen,我不能保证这是最终版本,所以我并不是说它适合所描述的目的,特别是不能使用与我正在处理的SQL不同的SQL格式,只是它是正则表达式中下行的特定示例.因人而异.UAYOR.
有几个答案指出的使用\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' *