sed one-liner将全部大写转换为小写?

mag*_*tar 115 regex sed

我有一个文本文件,其中一些单词打印在所有大写.我希望能够将文本文件中的所有内容转换为小写,使用sed.这意味着第一句话将会读到,'我有一个文本文件,其中一些单词都打印在所有大写字母中.'

mag*_*tar 217

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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

  • 我不得不选择自己的答案,因为我不喜欢只包含链接的答案. (5认同)
  • OSX不支持GNU扩展:( (5认同)
  • GNU sed 的 `sed -e 's/.*/\L&amp;/' input.txt &gt; output.txt` 也可以正常工作 (5认同)
  • \1/ 最后做什么? (2认同)

Luv*_*ode 42

如果你有GNU扩展,你可以使用sed的\ L(较低的整个匹配,或者直到\ L [lower]或\ E [end - toggle] off off),如下所示:

sed 's/.*/\L&/' <input >output
Run Code Online (Sandbox Code Playgroud)

注意:'&'表示完全匹配模式.

作为旁注,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...
Run Code Online (Sandbox Code Playgroud)

注意:由于假设我们有GNU的扩展,我们还可以使用破折号-R(扩展正则表达式)选项,它允许\ W(字字符),并免除了您不必逃避捕获括号和一个或更多的中量词(+).(旁白:\W [non-word], \s [whitespace], \S [non-whitespace]也支持与前围-R,但\d [digit]\D [non-digit]没有.)

  • 我真的需要这个“\E [结束 - 关闭大小写]”。谢谢 ! (2认同)

小智 34

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

echo "UPPER" | awk '{print tolower($0)}'
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,因为使用西里尔字母。tr: - 没有使用它。 (3认同)
  • 当心带有重音符号的字符。例如,“较低”将无法处理“À” (2认同)
  • 您可以使用该命令重命名一堆文件:`ls | awk '{print "mv " $0 " " tolower($0)}' | 嘘` (2认同)

Vou*_*uze 12

以下是许多解决方案:

使用perl,tr,sed和awk进行upercaser

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)}'
Run Code Online (Sandbox Code Playgroud)

用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)}'
Run Code Online (Sandbox Code Playgroud)

复杂的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
Run Code Online (Sandbox Code Playgroud)

复杂的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
Run Code Online (Sandbox Code Playgroud)

简单的bash到小写:

while read v;do echo "${v,,}"; done
Run Code Online (Sandbox Code Playgroud)

简单的bash到大写:

while read v;do echo "${v^^}"; done
Run Code Online (Sandbox Code Playgroud)

请注意,$ {v,}和$ {v ^}仅更改第一个字母.

你应该这样使用它:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
Run Code Online (Sandbox Code Playgroud)


小智 12

I like some of the answers here, but there is a sed command that should do the trick on any platform:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
Run Code Online (Sandbox Code Playgroud)

Anyway, it's easy to understand. And knowing about the y command can come in handy sometimes.

  • 这不适用于任意国际字符,但适用于 OS/X 中的 ASCII 字符 (2认同)

Suj*_*ale 7

echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'
Run Code Online (Sandbox Code Playgroud)

输出:

hello  my name is sujit