Linux 显示不带小写字母的输出

Linux 显示不带小写字母的输出,linux,string,unix,awk,grep,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 但这

我有一个格式为:

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
但这将作用于行的第一个字符,这是错误的。有什么建议吗?

试试这个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
试试这个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

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

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

    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
不要使用
原始文件
==
新文件
,因为这样不起作用。shell将在命令启动之前首先清除该文件(因为它是重定向输出,
>newfile
)。您将得到一个空文件


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

来输出第二个单词不以小写字母开头的行,使用

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

    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
不要使用
原始文件
==
新文件
,因为这样不起作用。shell将在命令启动之前首先清除该文件(因为它是重定向输出,
>newfile
)。您将得到一个空文件



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

您应该让您的规范更清晰。是否每行都以
en
开头?是否要筛选行或转换行?否,行可以以en.d或任何此类字符串开头,但在第一个字符串“en/en.v/en.d”和页面名称“Zyung”之间有一个空格。所以空间可以是最好的分隔符。我认为“不应该有小写字母”意味着我想筛选小写字母作为字符串的第一个字母。我想在文件中输出。@Kent:我同意。有时,一个输出示例胜过千言万语。似乎他想为那些想帮忙的人更努力地工作。35分钟后,我仍然不知道他想要实现什么。这个问题显然不太难解决。@Birei我猜他是这样想的:“你期望的输出是什么?”“我希望输出是一个文件。”“好的,你期望的输出是什么?”“哦,你很奇怪,你不明白吗,我说过我希望输出是一个文件!一个文件!”你应该让你的说明更清楚。是否每行都以
en
开头?是否要筛选行或转换行?否,行可以以en.d或任何此类字符串开头,但在第一个字符串“en/en.v/en.d”和页面名称“Zyung”之间有一个空格。所以空间可以是最好的分隔符。我认为“不应该有小写字母”意味着我想筛选小写字母作为字符串的第一个字母。我想在文件中输出。@Kent:我同意。有时,一个输出示例胜过千言万语。似乎他想为那些想帮忙的人更努力地工作。35分钟后,我仍然不知道他想要实现什么。这个问题显然不太难解决。@Birei我猜他是这样想的:“你的预期输出是什么?”“我希望输出是一个文件。”“好的,你的预期输出是什么?”“哦,你很奇怪,你不明白,我说我希望输出是一个文件!一个文件!”谢谢,这部分有效。但是行也可以以一个特殊的字符开头,所以只显示[a-Z]是行不通的。请参阅我编辑的问题。不要忽略小写字母。请尝试此
grep-E'^\S*\S+[^a-z]
@CtrlV请制作一个更好的示例,并粘贴预期的输出。请检查编辑@CtrlV感谢此操作部分有效。但是行也可以以一个特殊的字符开头,所以只显示[a-Z]是行不通的。请参阅我编辑的问题。不要忽略小写字母。试试这个
grep-E'^\S*\S+[^a-z]
@CtrlV请做一个更好的例子,并粘贴预期的输出。检查编辑@CtrlV出于某种原因,这没有过滤我需要的内容。你的第二个解决方案最接近我想要的。无论如何,谢谢你Animal@CtrlV:幸好你注意到了。我错过了模式开头的
^
(因此它只在字符串开头匹配)。现在已修复。您应该将
/^[^a-z]/
更改为
/^[^[:lower:]/
。它更加健壮。我的ubuntu对
a-z
a-z
得到了相同的结果,两者都给出了大写和小写。@Jotne:几乎没有比这更健壮的了,因为这种行为是特定于GNU awk的(
gawk
)。(
mawk
等。不支持像
[:lower:
这样的字符类,你看。)但是谢谢你的提醒;我添加了一个不同的修复程序,并添加了一些文本,如果其他人遇到类似问题,可能会有所帮助。出于某种原因,这并没有过滤我需要的内容。你的第二个解决方案最接近我想要的。