我有带有某些大小写内容的temp文件。

输入

我的temp文件的内容:

 hi
Jigar
GANDHI
jiga
 


我想将所有大写转换为小写。

命令

我尝试过以下命令:

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


,但输出错误。

输出

我希望它为:

hi
jigar
gandhi
jiga


sed的参数的替代部分需要什么?

评论

另请参见如何在bash中将UTF-8 txt文件转换为全部大写?

#1 楼

如果您的输入仅包含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(q4312078q)}' < input


评论


请注意\ L是GNU扩展。

–安东
2014年12月5日,7:48

\ L到目前为止对我有用。阐明您要进行GNU扩展的要点

–JigarGandhi
2014年12月5日7:56

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

–StéphaneChazelas
2014-12-5 13:25



请注意,某些tr的实现(例如GNU tr)在多字节语言环境中无法正常工作(例如,当今大多数,请尝试echoSTÉPHANE| tr'[:upper:]''[:lower:]')。在GNU系统上,您可能更喜欢sed变体或awk的tolower()。

–StéphaneChazelas
2014年12月5日13:29



轻微校正:sed's /.*/ \ L&/ g'<输入。除非您用wurtle在括号中指定带括号的子字符串,否则对匹配子字符串的\ 1引用将不起作用。但是,使用&表示整个比赛较为干净,如图所示

–爱德华·布朗
16年11月4日15:30



#2 楼

使用vim超级简单:

$ vim filename
gg0guGZZ


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

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

评论


大声笑“超级简单”

–兰伯特
17年2月17日在21:50

这显然不能很好地扩展许多文件

– Corey Goldberg
17年11月25日在13:40

@CoreyGoldberg vim file1 file2 fileetc,然后类似:bufdo gg0guG:w 可能适用于任何数量的文件。虽然还没有测试!

–TankorSmash
'18 Apr 22在0:18



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

– Corey Goldberg
18年4月22日在15:39

#3 楼

我自己喜欢dd

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


...得到...

hi
jigar
ghandi
jiga


LC_ALL=C用于保护输入中的任何多字节-尽管不会转换任何多字节大写字母。 (GNU)tr也是如此-这两个应用程序都容易在任何非C语言环境中进行输入处理。 iconv可以与两者结合使用,以提供全面的解决方案。

2>/dev/null重定向会丢弃dd的默认状态报告-及其stderr。如果没有它,dd将在完成上述工作之后执行w /打印信息,例如处理了多少字节等。

评论


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

–WhiteWinterWolf
16年8月18日在13:02

#4 楼

您还可以使用Perl 5: -p$_表示该程序将是下一个参数,而不是包含该脚本的文件。 -e转换为小写。不带任何参数,它将在lc上运行。然后$_再次保存,以便将其打印出来。最后不会打印。因此,除了保存到该变量之外,我还包括一个显式的print语句。

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

#5 楼

您需要捕获匹配的模式,然后将其用于带修饰符的替换中: \(...\)的下一个,依此类推。在嵌套捕获的情况下,编号是根据开括号而定。 >

评论


您不需要这样做-整个模式始终陷入&

–mikeserv
2014年12月5日,9:41

没错,但是那时候我会错失解释捕捉比赛的机会了:-)

–Wurtel
2014年12月5日,12:47

#6 楼

除了MvG的答案,您还可以使用Perl 6:外壳($ _是特殊的Bash参数;请参阅:https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html)