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' が一致するためです。

(「and の後に9文字が続く」と指定したため、{9} の {8} を変更しましたが、「and は 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

あなたが猫を飼うと、ライン全体が一度に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 に答える