将文件内容转换为小写


85

我有temp一些小写和大写内容的文件。

输入值

temp文件的内容:

hi
Jigar
GANDHI
jiga

我想将所有大写转换成小写

命令

我尝试了以下命令:

sed -e "s/[A-Z]/[a-z]/g" temp

但是输出错误。

输出量

我希望它是:

hi
jigar
gandhi
jiga

在论证的替代部分中需要做什么sed


Answers:


122

如果您的输入仅包含ASCII字符,则可以这样使用tr

tr A-Z a-z < input 

或(不太容易记住并键入IMO;但不限于ASCII拉丁字母,尽管在包括GNU在内的某些实现中tr,仍限于单字节字符,因此在UTF-8语言环境中,仍限于ASCII字母):

tr '[:upper:]' '[:lower:]' < input

如果您必须使用sed

sed 's/.*/\L&/g' < input

(此处假设采用GNU实现)。

使用POSIX sed,您需要指定所有音译,然后可以选择要转换的字母:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

awk

awk '{print tolower($0)}' < input

3
请注意,这\L是GNU扩展。
Anthon 2014年

\L到目前为止对我有用。En阐明了您要扩展GNU
JigarGandhi 2014年

2
@JigarGandhi。sed是Unix命令。不同的系统具有具有不同行为和功能的不同变体。幸运的是,如今,有一个最符合的标准,因此您可以指望所有通用的最少功能集。\L不在其中,而是由GNU引入的sed(与standard ex/ 中的相同运算符匹配vi),通常在其他实现中不可用。
斯特凡Chazelas

9
请注意,某些tr实现(例如GNU)tr在多字节语言环境中无法正常工作(echo STÉPHANE | tr '[:upper:]' '[:lower:]'例如,现在大多数尝试使用)。在GNU系统中,你可能更喜欢sed变体或awktolower()
斯特凡Chazelas

5
轻微校正:sed 's/.*/\L&/g' < input\1除非您用wurtle在括号中指定带括号的子字符串,否则对匹配子字符串的引用将不起作用。然而,这是稍微清洁剂使用&,以代表整个匹配,如图所示
爱德华·布朗

30

使用vim,它非常简单:

$ vim filename
gg0guGZZ

打开文件,gg转到第一行0第一列。使用guG,减小所有字符的大小写,直到文件底部。ZZ保存并退出。

它应该处理几乎所有您扔给它的东西;它将忽略数字,将处理非ASCII。

如果您想做相反的操作,则将小写字母变成大写字母,将u输出换成U:即可gg0gUGZZ


14
大声笑“超级简单”
blambert '17

对于许多文件来说,这显然不能很好地扩展
Corey Goldberg

迄今为止我最喜欢的答案!!!!
蒙娜·贾拉

1
@CoreyGoldberg vim file1 file2 fileetc然后像:bufdo gg0guG:w<CR>可能为任意数量的文件的工作。虽然还没有测试!
TankorSmash

@TankorSmash仍然无法缩放到大量文件
Corey Goldberg,

17

dd自己喜欢这个。

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

...得到...

hi
jigar
ghandi
jiga

LC_ALL=C是为了保护任何multibytes输入-虽然任何多资金不会被转换。(GNU) 也是这样tr-这两个应用程序都容易在任何非C语言环境中进行输入处理。iconv可以与任何一个结合使用以获得全面的解决方案。

2>/dev/null重定向丢弃dd的默认状态报告-和它的标准错误。没有它,dd将完成诸如上述的工作并打印信息,例如处理了多少字节等等。


此解决方案比tr处理大文件时快得多,谢谢!
WhiteWinterWolf

13

您还可以使用Perl 5:

perl -pe '$_=lc' temp

该选项-p告诉perl为输入的每一行运行一次指定的表达式,打印结果,即的最终值$_-e指示程序将是下一个参数,而不是包含脚本的文件。lc转换为小写。无需争论,它将在上运行$_。并$_=再次保存,以便将其打印出来。

的变化将是

perl -ne 'print lc' temp

使用-n是一样-p,只是$_不会得到最终打印。因此,我没有包含该变量,而是包含了一个显式打印语句。

与sed相比,Perl的一个优点是您不需要任何GNU扩展。有些项目必须与非GNU环境兼容,但也已经具有Perl作为依赖项。与相比tr,可能是Perl lc可以更轻松地实现区域感知。有关perllocale详细信息,请参见手册页。


9

您需要捕获匹配的模式,然后将其用于带有修饰符的替换中:

sed 's/\([A-Z]\)/\L\1/g' temp

\(...\)“捕获”的包围匹配的文本,第一个捕获进入\1下,旁\2所述的编号等,以在嵌套捕获的壳体开口括号。

\L转换摄像图案以降低情况下,也\U为大写。


3
您无需执行此操作-整个模式都会陷入困境&
mikeserv

没错,但是那时候我可能会错过解释捕获比赛的机会了:-)
Wurtel 2014年

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.