【问题标题】:sed one-liner to convert all uppercase to lowercase?sed one-liner 将所有大写字母转换为小写字母?
【发布时间】:2011-06-01 23:21:55
【问题描述】:

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

【问题讨论】:

  • 您知道tr 命令吗?有时候比sed更合适。
  • @Bryan Oakley 直到现在我才知道。感谢您指出。但是我该如何使用它来完成我的要求呢?
  • 查看 Raghuram 回答中提供的链接。
  • 如果必须使用 sed,cat | sed 'y/ABCDEFÑØÅÆŒ/abcdefñøåæœ/'

标签: regex sed


【解决方案1】:

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

sed 's/.*/\L&/' <input >output

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

附带说明,GNU 扩展包括 \U(上)、\u(上一个匹配字符)、\l(下一个匹配字符)。例如,如果你想用驼峰式命名一个句子:

$ sed -E 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

注意:由于假设我们有 GNU 扩展,我们可以使用 sequences,例如 \w(匹配单词字符)和 -Eextended 正则表达式)选项,这样您就不必转义一个或多个量词 (+) 和某些其他特殊的正则表达式字符。

【讨论】:

  • 非常有用的提示。我发现在骆驼案例示例中不需要圆括号。 's/\w+/\u&/g' 也可以。
  • sed -ri 's/MATCH_WHATEVER/\L&amp;/i' input-file.ext - 使用/i 修饰符使匹配不区分大小写,因此是可选的。 -i 开关告诉 sed 就地更改文件。如果不需要,则无需将输出重定向到另一个文件。
  • 我真的需要这个\E [end - toggle casing off]。谢谢!
  • 请注意,语法通常似乎是\L\1,因此\L&amp; 是缺少反斜杠的例外。我对此进行了测试,如果您在 &amp; 之前添加反斜杠,您只会得到文字 &amp;
【解决方案2】:

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

或者,sed 在 GNU 上(但不支持 BSD 或 Mac,因为它们不支持 \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
 

【讨论】:

  • 我必须自己选择答案,因为我不喜欢只包含链接的答案。
  • OSX 也不支持 GNU 扩展 :(
  • sed -e 's/.*/\L&amp;/' input.txt &gt; output.txt for GNU sed 也可以正常工作
  • @ekkis OSX 正在使用 BSD(如前所述,BSD sed 不支持它)。尝试阅读man sed 的第一行,以了解您使用的是哪个版本。
  • \1/最后做了什么?
【解决方案3】:

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

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

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

【讨论】:

  • 这不适用于任意国际字符,但适用于 OS/X 中的 ASCII 字符
  • 它确实为我完成了这项工作。我不得不承认这是我第一次使用 y 命令。谢谢!
【解决方案4】:
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

输出:

你好我的名字是sujit

【讨论】:

    【解决方案5】:

    这里有很多解决方案:

    使用 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
    

    【讨论】:

    • sed 示例中的 \U 和 \L 是 gnu 扩展。如果您希望它更便携,请记住一些事情
    【解决方案6】:

    短小精悍,你甚至不需要重定向 :-)

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

    【讨论】:

    • 哈,我试着用它看看后面,它以某种方式用其他随机大写字母替换了我文件中的大多数字母。反正给了我一个好笑。我也能够从这个答案中得出我想要的关于 perl 的信息:askubuntu.com/a/527073/250556
    【解决方案7】:

    如果你使用的是 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 上效果最好) - 很好,我的朋友 - 但有点小 - 你的 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,而不是替换 ('s'),你可以像这样使用音译 ('y'):sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz /'
    • 目标是在不更改数据源内容的情况下从非 GNU sed 中选择任何看起来像小写/大写的文本模式(y// 更改源的内容或可能错过模式搜索。
    【解决方案8】:

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

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

    【讨论】:

    • 它的最佳答案,因为使用西里尔字母。 tr: - 没用。
    • 注意带有重音符号的字符。例如tolower 将无法处理À
    • 您可以使用该命令重命名一堆文件:ls | awk '{print "mv " $0 " " tolower($0)}' | sh
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多