将文件内容转换为小写

Jig*_*dhi 101 shell tcsh sed text-processing tr

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

输入

我的temp文件内容:

hi
Jigar
GANDHI
jiga
Run Code Online (Sandbox Code Playgroud)

我想将所有upper转换为 lower

命令

我尝试了以下命令:

sed -e "s/[A-Z]/[a-z]/g" temp
Run Code Online (Sandbox Code Playgroud)

但得到了错误的输出。

输出

我想要它:

hi
jigar
gandhi
jiga
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*hon 153

如果您的输入仅包含 ASCII 字符,您可以使用tr类似:

tr A-Z a-z < input 
Run Code Online (Sandbox Code Playgroud)

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

tr '[:upper:]' '[:lower:]' < input
Run Code Online (Sandbox Code Playgroud)

如果您必须使用sed

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

(这里假设 GNU 实现)。

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

sed 'y/A?BC?DEFGH.../a?bc?defgh.../' < input
Run Code Online (Sandbox Code Playgroud)

awk

awk '{print tolower($0)}' < input
Run Code Online (Sandbox Code Playgroud)

  • 请注意,一些像 GNU `tr` 的 `tr` 实现在多字节语言环境中不能正常工作(现在大多数都是这样,尝试 `echo STÉPHANE | tr '[:upper:]' '[:lower:]'`例如)。在 GNU 系统上,您可能更喜欢 `sed` 变体或 `awk` 的 `tolower()`。 (9认同)
  • 轻微修正:`sed 's/.*/\L&amp;/g' &lt; input`。除非您像 wurtle 在他的中那样用括号指定子字符串,否则对匹配子字符串的“\1”引用将不起作用。但是,使用 `&amp;` 来表示整个匹配会更简洁一些,如图所示 (5认同)
  • 请注意,`\L` 是一个 GNU 扩展。 (4认同)
  • @吉加甘地。`sed` 是一个 Unix 命令。不同的系统有不同的变体,具有不同的行为和功能。值得庆幸的是,如今,有一个最符合标准的标准,因此您可以依靠最少的一组通用功能。`\L` 不在其中,它是由 GNU `sed` 引入的(匹配标准 `ex`/`vi` 中的相同操作符)并且在其他实现中通常不可用。 (2认同)

Tan*_*ash 31

使用vim,超级简单:

$ vim filename
gg0guGZZ
Run Code Online (Sandbox Code Playgroud)

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

它应该处理你扔给它的任何东西;它会忽略数字,它将处理非 ASCII。

如果你想做相反的事情,把小写字母变成大写字母,把u外面的字母换成U:gg0gUGZZ就可以了。

  • 大声笑“超级简单” (17认同)
  • @CoreyGoldberg `vim file1 file2 fileetc` 然后类似 `:bufdo gg0guG:w&lt;CR&gt;` 的东西*可能*适用于任意数量的文件。不过还没有测试过! (2认同)

mik*_*erv 18

我喜欢dd这个,我自己。

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN
Run Code Online (Sandbox Code Playgroud)

……得到……

hi
jigar
ghandi
jiga
Run Code Online (Sandbox Code Playgroud)

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

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


MvG*_*MvG 13

你也可以使用 Perl 5:

perl -pe '$_=lc' temp
Run Code Online (Sandbox Code Playgroud)

该选项-p告诉 perl 为每行输入运行一次指定的表达式,打印结果,即$_. -e表示程序将是下一个参数,而不是包含脚本的文件。lc转换为小写。没有参数,它将对 进行操作$_。并$_=再次保存它以便打印。

一个变种是

perl -ne 'print lc' temp
Run Code Online (Sandbox Code Playgroud)

使用-n就像-p除了$_最终不会被打印出来。因此,我没有保存到该变量,而是包含了一个显式的打印语句。

与 sed 相比,Perl 的一个好处是您不需要任何 GNU 扩展。有些项目必须与非 GNU 环境兼容,但也已经具有 Perl asa 依赖项。与 相比tr,Perllc可能更容易识别区域设置。有关perllocale详细信息,请参阅手册页。


wur*_*tel 9

您需要捕获匹配的模式,然后在带有修饰符的替换中使用它:

sed 's/\([A-Z]\)/\L\1/g' temp
Run Code Online (Sandbox Code Playgroud)

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

\L摄像图案为小写转换,这里还有\U为大写。

  • 你不需要这样做 - 整个模式总是被捕获在 `&amp;` (3认同)