请有人能够解释如何将文本文件中的所有小写字符转换为大写,然后将其另存为新文件?我的文件名为 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
规则,所以可能更适合像这样的词办公室(将该一个ffi
字符转换为三个字符FFI
1)。
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
保存到输出文件。
或者使用任何ex
或vi
实现(尽管并非所有实现都会处理非 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:]
awk
:toupper
改成tolower
dd
:ucase
改成lcase
- GNU
sed
//ex
:vi
更改\U
为\L
perl
:uc
改成lc
。uconv
:upper
改成lower
vim
:更改gUG
为guG
(这是技巧之一)。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
是我们通过用括号括住正则表达式来保存的字符
进一步阅读:
答案4
建议的 sed-oneliners(@Stéphane Chazelas、@Kusalananda)都使用“s”子命令,这不是完成这项工作的最佳工具。使用“y”将一个(一组)字符更改为另一个字符更容易且效果更好:
sed 'y/abcde/ABCDE/' infile > outfile
会将第一个字符串中出现的第一个字符转换为第二个字符串中的第一个字符,将第一个字符串中出现的第二个字符转换为第二个字符串中的第二个字符,依此类推。将上面的“abcde”字符串替换为您想要的任何“字符转换表”,您可以使用 sed 能够处理的任何字符集/编码来转换文件。