Grep 查找大写字母的连续单词

Grep 查找大写字母的连续单词

我试图找到两个以大写字母开头的连续单词。

例子

输入:x Yyy Zzz xx y

输出:Yyy Zzz

现在我可以找到所有大写字母cat txtfile.txt | grep -o '\<[A-Z][a-z]*\>'

如何更改代码以便获得输出?

亲切的问候

答案1

使用 Raku(以前称为 Perl_6)

raku -ne 'my @a = .words.rotor(2 => -1); for @a {.put if $_ ~~ $_.map(*.wordcase)};'  

输入示例:

x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb

示例输出:

Yyy Zzz
Yyy Zzz
Zzz Www
Mmm: Yyy
Bbb Bbb
Bbb Bbb
Bbb Bbb

调用.words指示 Raku 在空白处分割输入行。这些词被组合rotor在一起。该rotor参数(2 => -1)指示将单词视为具有重叠的相邻对,以便创建每个连续的重叠单词对。

单词对被加载到$_主题变量中,并测试它们是否与 匹配$_.map(*.wordcase),换句话说,测试它们是否匹配其自身的版本,其中每个单词(首字母)大写。如果找到匹配项,则$_必须是(首字母)大写单词对,并且返回此类单词对。

请注意,如果需要逐行返回,则.put可以将调用替换为 (例如) print "$_, "unique如果只需要唯一的单词对,Raku 也有一个例程。

https://docs.raku.org/routine/wordcase
https://docs.raku.org/routine/rotor
https://raku.org

答案2

这应该可以完成这项工作:

cat txtfile.txt | grep -o '[A-Z][a-z]* [A-Z][a-z]*'

答案3

以卡西莫多的例子和其他可能的情况为例,并假设标点符号必须匹配,并且两个以上连续单词大写,使用 GNU grep

$ cat file
x Yyy Zzz xx y
x Yyy Zzz Www
a Mmm: Yyy bbb
aaa aaa aaa
Ccc ccc CCC
Bbb Bbb Bbb Bbb
$ grep -P '[AZ][^ ]*(?: +[AZ][^ ]*)+' 文件
Xyyy Zzzxxy
XYyy Zzz Www
A嗯:嗯嗯bbb
噗噗噗噗噗噗

  • [A-Z][^ ]*匹配大写字母后跟任何非空格字符的单词。
  • (?: +[A-Z][^ ]*)+匹配一个或多个空格,后跟重复一次或多次提到的模式。

正如 @cas 所建议的,有一个替代方案:

使用-z将检测连续的大写单词,甚至跨行边界(例如CCC\nBbb)。并且使用\s而不只是空格将使其也可以与制表符和其他空格一起使用。

grep -z -P '[A-Z][^\s]*(?:\s+[A-Z][^\s]*)+' file

相关内容