sed单行将所有大写字母转换为小写字母?


131

我有一个文本文件,其中所有单词都印有一些大写字母。我希望能够使用将文本文件中的所有内容都转换为小写sed。这意味着第一句将显示为:“我有一个文本文件,其中所有大写字母都印有一些单词。”


6
您知道tr命令吗?有时它比更加合适sed
布莱恩·奥克利

@布莱恩·奥克利(Bryan Oakley)我才不是。感谢您指出。但是,如何使用它来完成我要问的事情?
磁石

查看Raghuram答案中提供的链接。
布莱恩·奥克利

1
如果必须使用sed,请输入cat <input> | sed'y /ABCDEFÑØÅÆŒ/abcdefñøåæœ// <-您必须详细说明所有字符,从大写到小写。我知道写所有这些字符很麻烦,但也可以与所有这些国际特殊字符一起使用。:)
Arno Teigseth

Answers:


248

tr

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

使用GNU可以工作sed(BSD sed不支持\L \U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt

6
我必须选择自己的答案,因为我不喜欢仅包含链接的答案。
磁石

6
OSX也不支持GNU扩展:(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtGNU sed也可以正常工作
Asfand Qazi

1
@ekkis OSX正在使用BSD(如上所述,BSD sed不支持它)。尝试阅读第一行的内容,man sed以了解您使用的是哪个版本。
莱德(Ryder)

由于某种原因,当我使用大写字母模式时,它会U在每行前面添加一个
Xtremefaith

51

如果您具有GNU扩展名,则可以使用sed的\ L(降低整个匹配项,或者直到达到\ L [降低]或\ E [结束-切换外壳关闭]),如下所示:

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(扩展的正则表达式)选项,该选项允许\ w(字字符),从而使您不必逃避捕获括号和一个或多个量词(+)。(旁白:\W [non-word], \s [whitespace], \S [non-whitespace]也支持与前围-R,但\d [digit]\D [non-digit]没有。)


1
非常有用的提示。我发现在骆驼案例示例中不需要圆括号。's / \ w + / \ u&/ g'也可以。
PJ_Finnegan

1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext-使用/i修饰符会使匹配不区分大小写,因此是可选的。该-i开关告诉sed改变就地文件。无需将输出重定向到另一个文件。
吉姆(Jim)

1
我真的需要这个\E [end - toggle casing off]。谢谢 !
Mehdi Yedes

37

awk如果您愿意考虑使用其他工具,也可以使用轻松完成此操作:

echo "UPPER" | awk '{print tolower($0)}'

1
最好的答案,因为与西里尔文一起工作。tr:-没有使用它。
Amaroc

2
注意带有重音符号的字符。例如tolowerÀ
Sam Houston

您可以使用以下命令重命名一堆文件: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

这里有很多解决方案:

与perl,tr,sed和awk一起使用

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

用perl,tr,sed和awk小写

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\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


5

我喜欢这里的一些答案,但是有一个sed命令可以在任何平台上解决问题:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

无论如何,这很容易理解。有时,了解y命令可能会派上用场。


2
这不适用于任意国际字符,但适用于OS / X中的ASCII字符
emrys57

它确实为我完成了工作。我必须承认这是我第一次使用y命令。谢谢!
星期一

4

如果您使用的是posix sed

选择任何情况下的模式(使用此sed转换搜索到的模式,而不是使用正则表达式在想要的命令中使用转换后的模式:

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"

大写字母相同,用sed中的大写替换//之间的小写字母

玩得开心


(我发现这是在MacOS上效果最好的)-很好,我的朋友-但是一个很小的topo-您的Jj情况倒退了。应以“ 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 / [jJ] / j / 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“
尼尔·麦吉尔

我不确定为什么您需要做一些劳动强度大的工作。我假设Mac OS没有GNU扩展,但是如果您不愿意使用sed,则可以像这样使用音译('y'):sed'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz /'
Luv2code

目标是从非GNU sed中选择看起来像小写/大写的任何文本模式,而不更改数据源y//的内容(更改源的内容或可能会错过模式搜索。)
NeronLeVelu

3

简短,可爱,您甚至不需要重定向:-)

perl -p -i -e 'tr/A-Z/a-z/' file

嗯,好吧,我试图在后面使用它,并且它以某种方式用其他随机的大写字母替换了我文件中的所有字母。反正给了我一个好笑。我也可以从有关Perl的答案中得到我想要的东西:askubuntu.com/a/527073/250556
ThorSummoner 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.