0

我将其作为一个新问题提出,因为人们似乎不理解我原来的问题。

我可以弄清楚如何查找一个单词是否以大写字母开头,后跟 9 个带有代码的字母:

echo "word" | grep -Eo '^[A-Z][[:alpha:]]{8}'

所以这是我应该做的第 1 部分。我的实际脚本应该遍历作为第一个也是唯一一个参数给出的文本文件中的每个单词,然后检查这些单词中是否有任何单词以大写字母开头并且长度为 9 个字母。

我试过了:

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

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

无济于事。

虽然:

cat randomtext.txt 

输出:

The loud Brown Cow jumped over the White Moon. November October tesTer Abcdefgh Abcdefgha

所以它正确输出了文件 randomtext.txt 中的所有单词

那为什么不

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

工作?

4

4 回答 4

2

问题出在锚点上。您的模式以与^行首匹配的开头,但您想要返回的单词位于行的中间。您可以将其替换为\b以匹配单词边界。

于 2012-10-22T19:25:03.477 回答
1

单词都是一个接一个,但你的grep表达是指一整行

您应该将文件拆分为单词:

sed -e 's/\s*\b\s*/\n/g' < file.txt | grep ...

或者更好,因为你只对字母数字序列感兴趣,

sed -e 's/\W\W*/\n/g' < file.txt | grep -E '^[A-Z][[:alpha:]]{8}$'

$(行尾)是必要的,否则 'Supercalifragilisticexpialidocious' 将匹配。

(我在 {9} 中修改了 {8},因为您指定了“并且后跟9个字母”,但后来我看到您还声明“并且是 9 个字母长”)

顺便说一句,如果您使用 {8} 和 -o,您可能会认为匹配项存在于它不存在的地方。“-o”表示“只打印与我的模式匹配的部分”。

因此,如果您将“Supercalifragilistic”输入“^[AZ][[:alpha:]]{8}”,它将接受它作为匹配项并打印“Supercali”。这不是我想你问的。

于 2012-10-22T19:27:10.883 回答
0

你应该做这个 :

$ cat file.txt
The loud Brown Cow jumped over the White Moon. November October tesTer Abcdefgh Abcdefgha
$ printf '%s\n' $(<file.txt) | grep -Eo '^[A-Z][[:alpha:]]{8}$' 
Abcdefgha

如果要在同一源代码行上工作,则需要删除^字符(表示行首):

grep -Eo '\b[A-Z][[:alpha:]]{8}\b' file.txt

\b像 choroba 解释的那样添加)

于 2012-10-22T19:24:01.293 回答
0

如果你 cat 整条线立即喂给 grep。您应该在喂给 grep 之前拆分单词。

你可以试试:

cat randomtext | awk '{ for(i=1; i <= NF; i++) {print $i } }' | grep -Eo '^[A-Z][a-z]{8}'
于 2012-10-22T19:25:22.263 回答