我有一个格式为的文件:
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
但是这会对线路的第一个字符起作用。有什么建议吗?
答案 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