使用大写字母的Grep语法

时间:2012-10-22 17:54:33

标签: linux bash grep

我正在尝试编写一个脚本,其中一个文件作为一个参数,用于查找文本文件以查找以大写字母开头且后面有8个字母的任何单词。我的语法很糟糕,所以我会告诉你我的代码,我相信这很容易解决。

grep -o '[A-Z][^ ]*' $1

我不确定如何指定:

a)以大写字母开头,

b)这是一个9个字母的单词。

干杯

编辑:

作为编辑,我想添加新代码:

while read p
do
echo $p | grep -Eo '^[A-Z][[:alpha:]]{8}'
done < $1

我仍然无法使用它,对我的新代码有任何帮助吗?

3 个答案:

答案 0 :(得分:2)

'[A-Z][^ ]*'将匹配A和Z之间的一个字符,后跟零个或多个非空格字符。所以它会匹配任何A-Z角色。

使用\b表示单词边界,并在大括号内指示量词,例如:

grep '\b[A-Z][a-z]\{8\}\b'

如果您刚刚grep '[A-Z][a-z]\{8\}'匹配(例如)“aaaaHellosailor”。

我使用\{8\},除非您使用grep -E(也称为egrep,使用扩展正则表达式),否则需要对其进行转义。您正在使用的Vanilla grep使用Basic Regular Expressions。另请注意,\b不是标准的一部分,但通常受支持。

如果您在开始时使用^而在结尾使用$那么它将不会在“威尔特郡的猪制作香肠”中找到“威尔特郡”,它只能找到的行只是由一个9个字符代词组成,没有别的。

答案 1 :(得分:1)

这对我有用:

$ echo "one-Abcdefgh.foo" | grep -o -E '[A-Z][[:alpha:]]{8}'
$ echo "one-Abcdefghi.foo" | grep -o -E '[A-Z][[:alpha:]]{8}'
Abcdefghi
$ 

请注意,这不会处理扩展名或前缀。如果你想强制输入为9个字母的大写单词,我们需要更明确:

$ echo "one-Abcdefghij.foo" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b'
$ echo "Abcdefghij" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b'
$ echo "Abcdefghi" | grep -o -E '\b[A-Z][[:alpha:]]{8}\b'
Abcdefghi
$ 

答案 2 :(得分:0)

我有一个名为'testfile'的测试文件,其中包含以下内容:

Aabcdefgh
Babcdefgh
cabcdefgh
eabcd

现在,您可以使用以下命令在此文件中进行grep:

grep -Eo '^[A-Z][[:alpha:]]{8}' testfile

上面的代码等于:

cat testfile | grep -Eo '^[A-Z][[:alpha:]]{8}'

匹配

Aabcdefgh
Babcdefgh