如何在 bash 脚本中过滤以大写开头的单词?我有一个 text.txt ,我只想查找以大写字母(Nnnn)开头的单词

如何在 bash 脚本中过滤以大写开头的单词?我有一个 text.txt ,我只想查找以大写字母(Nnnn)开头的单词

我只想查找以大写字母开头的单词。言语必须遵循这种模式。 “嗯嗯”。

我有一个带有文本的 .txt 文件。我尝试使用 grep 但没有成功。

答案1

因此,您需要一个大写字母后跟 4 个字符,例如:

$ cat test
lower
Upper
notrequired
This1
$ grep '[A-Z]....' test
Upper
This1

点 ( .) 匹配除换行符之外的任何字符。

答案2

如果您grep支持非标准-w-o选项,您可以这样做:

grep -wo '[[:upper:]][[:lower:]]*'

输出由一个大写字母后跟 0 个或多个小写字母组成的o单词w(在这种情况下,单词由非单词字符分隔,单词字符是数字或下划线)。

例如,对于这样的输入:

Let's rock the UK, Stéphane! tEst Test2

它输出:

Let
Stéphane

只要é表示为单个小写 U+00E9 字符即可。如果它被表达为e后面跟着 U+0301 结合尖锐的口音,你会得到LetandSte相反,U+0301 不被认为是一个字字符

您可能还想接受组合标记来解决这个问题,为此您需要类似grepwithperl的正则表达式支持:

grep -Po '\G(\X*(?=[^\w])\X)?\K\p{Lu}[\p{Ll}\pM]*+(?!\w)'

在哪里:

  • \G匹配行的开头或上一场比赛的结尾之后。
  • \X匹配字素簇,因此将包括基本字符和所有组合标记(或更一般地分解的字符),而不允许它们被分解。
  • (?=[^\w])\X是一个由非单词字符引导的字素簇,以确保我们找到的单词像 with 一样被正确分隔,grep -w以便例如Foo如果在 include 中找到则不会报告,éFoo然后 é 表示为e<U+0301>
  • \K重置比赛的开始,因此我们只K读取(和o输出)右侧的内容。\G与 结合使用\K通常可以解决在 perl/PCRE 中使用固定长度匹配来查找操作符的事实。
  • \p{Lu}u与ppercase Letter rperty匹配字符p,perl 相当于 POSIX' [[:upper:]]
  • \pM对于M方舟,\p{Ll}对于l小柜字母L
  • *+类似于*但禁止回溯,以便永久包含所有标记和小写字母,所以我们不必担心标记:
  • (?!\w),对 a 的负面展望字字符。如果我们没有+上述内容,我们需要(?![\w\pM])避免Fe返回FéF实例(使用éas eU+0301)。

答案3

也试试

grep -o "\b[[:upper:]].*\b" file

-o选项将仅输出找到的匹配项,并且将\b确保我们只考虑整个单词man grep

符号 \b 匹配单词边缘的空字符串

答案4

这对我有用,也可能对你有帮助:

for i in $(cat file); do [[ $i =~ ^[A-Z].[a-z]+$ ]] && echo $i; done

相关内容