我有temp
一些包含小写和大写内容的文件。
输入
我的文件内容temp
:
hi
Jigar
GANDHI
jiga
我想全部转换从上到下。
命令
我尝试了以下命令:
sed -e "s/[A-Z]/[a-z]/g" temp
但输出错误。
输出
我希望它是:
hi
jigar
gandhi
jiga
需要在什么代替论证的一部分sed
?
答案1
如果您的输入仅包含 ASCII 字符,您可以使用tr
:
tr A-Z a-z < input
或(不太容易记住和键入 IMO;但不限于 ASCII 拉丁字母,尽管在包括 GNU 在内的某些实现中tr
,仍然仅限于单字节字符,因此在 UTF-8 语言环境中,仍然仅限于 ASCII 字母):
tr '[:upper:]' '[:lower:]' < input
如果你必须使用sed
:
sed 's/.*/\L&/g' < input
(这里假设 GNU 实现)。
使用 POSIX sed
,您需要指定所有音译,然后您可以选择要转换的字母:
sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input
和awk
:
awk '{print tolower($0)}' < input
答案2
使用 vim,超级简单:
$ vim filename
gg0guGZZ
打开文件,gg
转到第一行、0
第一列。使用 时guG
,会降低所有字符的大小写,直到文件底部。ZZ
保存并退出。
它应该能够处理你扔给它的任何东西;它会忽略数字,它会处理非 ASCII。
如果您想做相反的事情,请将小写字母变成大写字母,将其替换u
为U
:gg0gUGZZ
即可。
答案3
我dd
自己就喜欢这个。
<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar
GANDHI
jiga
IN
...得到...
hi
jigar
ghandi
jiga
这LC_ALL=C
是为了保护输入中的任何多字节 - 尽管任何多字节大写都不会被转换。对于(GNU) tr
- 这两个应用程序都容易在任何非 C 语言环境中出现输入损坏。iconv
可以与其中任何一个结合起来形成全面的解决方案。
重定向2>/dev/null
丢弃dd
的默认状态报告 - 及其 stderr。如果没有它,dd
就会完成上面的工作,并打印信息,例如处理了多少字节等。
答案4
您需要捕获匹配的模式,然后在带有修饰符的替换中使用它:
sed 's/\([A-Z]\)/\L\1/g' temp
“捕获\(...\)
”封闭的匹配文本,第一个捕获转到\1
,下一个捕获到\2
,等等。在嵌套捕获的情况下,编号根据左括号进行。
\L
将捕获的模式转换为小写,也有大写\U
。