显示不带小写字母的输出

时间:2013-09-07 22:54:55

标签: linux string unix awk grep

我有一个格式为的文件:

en Zyung 1 630
en zz%20top%20la%20grange%201st%20guitar%20solo 1 657
en Zz%20top%20la%20grange%20remastered 1 652
en.b %7Eobsidian 1 6937
en.b %C3%9Eie_Nummern/3 2 7521

我希望第一个空格之后的第二个字符串意味着“zyung”不应该有小写字母作为第一个字母。我有:

grep -i [a-z] filename

但是这会对线路的第一个字符起作用。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

要输出第二个单词不以小写字母开头的行(实际上,以不是小写字母的字符开头),请使用

    env LANG=C LC_ALL=C awk '$2 ~ /^[^a-z]/' filename

或者,将该输出重定向到另一个文件

    env LANG=C LC_ALL=C awk '$2 ~ /^[^a-z]/' originalfile > newfile

要将每行第二个单词的第一个字母转换为大写,请使用

    env LANG=C LC_ALL=C awk '{ $2 = toupper(substr($2,1,1)) substr($2,2) } 1' filename

或者,要重定向到另一个文件,

    env LANG=C LC_ALL=C awk '{ $2 = toupper(substr($2,1,1)) substr($2,2) } 1' originalfile > newfile

请勿使用originalfile == newfile,因为这不起作用。在命令启动之前,shell将首先清除文件(因为它是重定向输出,> newfile)。你最终会得到一个空文件。

env LANG=C LC_ALL=C增加了避免使用GNU awk和非POSIX语言环境的情况; gawk匹配[a-z]与任何字母匹配,而不仅仅是小写字母。如果您需要区域设置感知行为,请使用非gawk awk,例如mawk,或者使用Jotne建议,^[^[:lower:]]代替^[^a-z]

答案 1 :(得分:2)

试试这个grep:

grep -E '^\S*\s+[A-Z]' file

用你的例子测试:

kent$ echo "en Zyung 1 630
en zz%20top%20la%20grange%201st%20guitar%20solo 1 657
en Zz%20top%20la%20grange%20remastered 1 652"|grep -E '^\S*\s+[A-Z]'
en Zyung 1 630
en Zz%20top%20la%20grange%20remastered 1 652

你可以看到,第二行被过滤掉了。

修改

试试这一行:

grep -E '^\S*\s+[^a-z]' file