我正在研究 sed 命令。我写了一个命令,用大写字母替换单词的第一个字母:
sed -e "s/\b\(.\)/\u\1/g"
但是我不知道如何找到所有单词都以大写字母开头的行。
例如,我的文本文件:
Hello world
Hello World
Lorem Ipsum sample
该命令应返回一行:
Hello World
答案 0 :(得分:2)
我可以通过匹配至少有一个以小写字母开头的单词的行并删除它们来做到这一点:
sqlite3.connect('file:foobar_database?mode=memory&cache=shared', uri=True)
sed '/\b[[:lower:]]/d' infile
是GNU扩展,因此这需要GNU sed。
答案 1 :(得分:1)
sed用于做s / old / new / 全部。对于其他任何事情,只需使用awk即可实现简单性,清晰度,鲁棒性,可移植性,性能等...
看:
if (timeOfDay != PM || timeOfDay != AM){
System.out.println("\"AM\" or \"PM\" was not specified. Please try again.");
System.exit(0);
}
每个单词以大写字母开头的行:
$ cat file
Hello world
Hello World
Lorem Ipsum sample
Lorem ipsum Foo bar And stuff
其中两个单词以大写字母开头的行:
$ awk 'gsub(/(^| )[[:upper:]]/,"&") == NF' file
Hello World
超过1个单词以大写字母开头的行:
$ awk 'gsub(/(^| )[[:upper:]]/,"&") == 2' file
Hello World
Lorem Ipsum sample
以大写字母和小写字母开头的单词数相同的行:
$ awk 'gsub(/(^| )[[:upper:]]/,"&") > 1' file
Hello World
Lorem Ipsum sample
Lorem ipsum Foo bar And stuff
如果需求发生变化,请尝试将您得到的所有sed脚本用于回答问题,并在上述情况(或任何其他情况!)的基础上构建该脚本。
以上内容适用于任何UNIX盒子上任何shell中的任何awk。
答案 2 :(得分:0)
对于这样的事情,您需要匹配整行,即^...$
。这适用于您的示例:
sed -E '/^ *(([A-Z][^ ]*) +)*[A-Z][^ ]*$/!d'
*
-在行的开头留出可选空间(([A-Z][^ ]*) +)*
-匹配大写字母,后跟任意数量的非空格字符,后跟一个或多个空格。整个组可以任意重复[A-Z][^ ]* *
-最后,该行应以大写字母结尾,后跟可选空格!d
删除与正则表达式不匹配的所有行