如何将文本文件从小写转换为大写并另存为新文件

如何将文本文件从小写转换为大写并另存为新文件

请有人能够解释如何将文本文件中的所有小写字符转换为大写,然后将其另存为新文件?我的文件名为 NewFile.txt,包含 500 行随机字符。

答案1

在 POSIX 工具箱中,有:

<input.txt tr '[:lower:]' '[:upper:]' >output.txt

但请注意对于 GNU 实现,仅适用于单字节字符;例如,在使用 UTF-8 字符集的语言环境中,仅适用于不带变音符号的 abcdefghijklmnopqrstuvwxyz 字母。

<input.txt awk '{print toupper($0)}' >output.txt

也是 POSIX,并且可以与awk.

<input.txt dd conv=ucase >output.txt

也是 POSIX,但没有多少实现会音译非 ASCII 字符。

<input.txt sed 's/.*/\U&/g' > output.txt

适用于 GNU sed,但sed仅适用于 GNU (这\U不是标准的)。

perl

<input.txt perl -Mopen=locale -pe '$_=uc' >output.txt

那个不使用区域设置的toupper规则,所以可能更适合像这样的词办公室(将该一个字符转换为三个字符FFI1)。

uconv,来自 ICU 项目的应该非常擅长处理各种国际极端情况,并假设输入/输出以 UTF-8 编码(或任何uconv --default-code返回;尽管请参阅-f/--from-code-t/--to-code选项来指定不同的输入和输出编码):

<input.txt uconv -x upper >output.txt

vim编辑器中,如果位于文件的第一个字符(gg到达那里),请输入gUG将所有字符转换为大写,直到文件末尾。然后:saveas output.txt保存到输出文件。

或者使用任何exvi实现(尽管并非所有实现都会处理非 ASCII 字符):(:%s/.*/\U&/并将:w output.txt编辑的文件写入output.txt:q!退出而不保存现在修改的输入文件)。

带壳zsh

zmodload zsh/mapfile
mapfile[output.txt]=${(U)mapfile[input.txt]}
# or (csh-style):
mapfile[output.txt]=$mapfile[input.txt]:u

要从大写转换为小写,以防万一,这还不是很明显:

  • tr: 交换[:lower:][:upper:]
  • awktoupper改成tolower
  • dducase改成lcase
  • GNU sed// ex:vi更改\U\L
  • perluc改成lc
  • uconvupper改成lower
  • vim:更改gUGguG(这是技巧之一)。
  • zsh:(U)改为(L),:u:l

1 C / POSIX toupper()/ towupper()API 一次只能将一个字符转换为另一个字符,因此更改文本大小写的方式受到限制。看https://unicode-org.github.io/icu/userguide/icu/posix.html#case-mappings关于这个以及更多。

答案2

仅使用内置命令的 bash one(ish) 行程序......

f="$(< infile.txt)" ; printf "%s" "${f^^}" > outfile.txt ; unset f

f我们用 的内容填充临时变量infile.txt

然后我们打印f到 STDOUT,同时使用 bash 变量技巧将其大写 ( ${f^^}) 并将 STDOUT 重定向到outfile.txt.

警告:如果“随机性”偏离拉丁字符和可打印字符,可能会出现这种情况。还会删除所有尾随换行符。

根据评论,这可能更好(更有效,没有换行符丢弃):

readarray f < infile.txt ; printf %s "${f[@]^^}" > outfile.txt ; unset f

答案3

sed您可以使用 GNU (您最有可能在 Linux 系统上使用的)在命令行中执行此操作:

sed -e 's/\([a-z]\)/\U\1/g' filename >newfilename

解释:

sed是一个程序,您可以使用正则表达式将字符串流处理为其他内容。它接受来自标准输入或文件的输入,并写入标准输出。

现在来分解所使用的正则表达式:

要进行替换,请使用语法s/<expression>/<new_expression>/g.您可以使用一个表达式来查找要替换的匹配文本,并使用另一个表达式来指示如何替换。我们用来查找匹配的正则表达式是([a-z])(忽略转义括号的反斜杠)。此正则表达式查找任何小写字符;用括号括住表达式可以让我们保存该字符以供将来参考。

然后,对于替换,我们使用\U\1, where\U转换为大写(“U”表示大写),并且\1是我们通过用括号括住正则表达式来保存的字符


进一步阅读:

  • 反向引用和子表达式。这些是我们用来保存匹配以供将来参考的括号,并再次引用它\1
  • 大/小写转换。在这里您将找到 的详细说明\U,以及可用于转换的其他运算符

答案4

建议的 sed-oneliners(@Stéphane Chazelas、@Kusalananda)都使用“s”子命令,这不是完成这项工作的最佳工具。使用“y”将一个(一组)字符更改为另一个字符更容易且效果更好:

sed 'y/abcde/ABCDE/' infile > outfile

会将第一个字符串中出现的第一个字符转换为第二个字符串中的第一个字符,将第一个字符串中出现的第二个字符转换为第二个字符串中的第二个字符,依此类推。将上面的“abcde”字符串替换为您想要的任何“字符转换表”,您可以使用 sed 能够处理的任何字符集/编码来转换文件。

相关内容