0

I have a file with a format :

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

I want that the second string after first space that means "zyung" should not have small letter as first letter. I have got:

grep -i [a-z] filename

But this will act on first character of the line which is wrong. Any suggestion?

4

2 回答 2

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,因为那是行不通的。> newfile在命令启动之前,shell 将首先清除文件(因为它是重定向输出)。你最终会得到一个空文件。

添加的env LANG=C LC_ALL=C内容避免了您使用 GNU awk 和非 POSIX 语言环境的情况;gawk匹配任何[a-z]字母,而不仅仅是小写字母。如果您想要区域设置感知行为,请使用 non-gawk awk,saymawk或像 Jotne 建议的那样,^[^[:lower:]]而不是^[^a-z].

于 2013-09-07T23:24:36.640 回答
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
于 2013-09-07T23:13:19.550 回答