sed单线程将所有大写转换为小写?
我有一个文本文件,其中有一些单词打印在全部大写。 我希望能够将文本文件中的所有内容都转换为小写,使用sed
。 这意味着,第一句话将会读出'我有一个文本文件,其中有一些单词被打印在所有大写字母中'。
用tr
:
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt
用GNU sed
(BSD sed
不支持\L
):
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt
如果你有GNU扩展,你可以使用sed的\ L(低整个匹配,或直到\ L [下]或\ E [结束 – 切换套pipeclosures]),如下所示:
sed 's/.*/\L&/' <input >output
注意:“&”表示完全匹配模式。
作为附注,GNU扩展包括\ U(上),\ u(匹配的上一个下一个字符),\ l(下一个匹配的下一个字符)。 例如,如果你想要一个句子:
$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case Now Is The Time For All Good Men...
注意:由于假设是我们有GNU扩展,所以我们也可以使用dash-r(扩展的正则expression式)选项,它允许\ w(单词字符),并且使您不必离开捕获括号和一个或多个量词(+)。 (除此之外: \W [non-word], \s [whitespace], \S [non-whitespace]
也支持dash-r,但是\d [digit]
和\D [non-digit]
不是。
如果你愿意考虑一个不同的工具,你也可以用awk
很容易地做到这一点:
echo "UPPER" | awk '{print tolower($0)}'
这里有很多解决scheme:
用perl,tr,sed和awk把upercaser
perl -ne 'print uc' perl -npe '$_=uc' perl -npe 'tr/[az]/[AZ]/' perl -npe 'tr/az/AZ/' tr '[az]' '[AZ]' sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ sed 's/\([az]\)/\U\1/g' sed 's/.*/\U&/' awk '{print toupper($0)}'
用perl,tr,sed和awk小写
perl -ne 'print lc' perl -npe '$_=lc' perl -npe 'tr/[AZ]/[az]/' perl -npe 'tr/AZ/az/' tr '[AZ]' '[az]' sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ sed 's/\([AZ]\)/\L\1/g' sed 's/.*/\L&/' awk '{print tolower($0)}'
复杂的bash小写:
while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done
复杂的bash大写:
while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done
简单的bash小写:
while read v;do echo "${v,,}"; done
简单的bash大写:
while read v;do echo "${v^^}"; done
请注意,$ {v,}和$ {v ^}只会更改第一个字母。
你应该这样使用它:
(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
如果你正在使用posix sed
select模式的任何情况下(使用此sed转换search的模式比使用正则expression式中使用转换的模式想要的命令:
echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern YourInputStreamCommand | egrep "${MyNewPattern}"
转换成小写
sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"
相同的大写replace//之间的较低的字母在sed上的等价物
玩的开心
echo "Hello MY name is SUJIT " | sed 's/./\L&/g'
输出:
你好我的名字是sujit
简短,甜蜜,你甚至不需要redirect:-)
perl -p -i -e 'tr/AZ/az/' file
我喜欢这里的一些答案,但是有一个sed命令可以在任何平台上实现:
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
无论如何,这很容易理解。 了解y命令有时候会派上用场。