我试图找到两个以大写字母开头的连续单词。
例子
输入: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