
電子メールの所有者がどこかに休暇を過ごすように招待された仮想電子メールの記録を受け取る場所でやるべきことがあります。ただし、ログのサイズが大きいため、作業速度を上げるには、どういうわけかgrep
ヘッダーアドレスを使用して電子メールアドレスの所有者を見つける必要があります。
住所のデフォルトの書面形式は次のとおりです。
name firstName
streetName streetNumber
postalCode(zip) City
郵便番号が通常5桁であることがわかったので、郵便番号を含む行を見つけることができます。これまで私がしたことは次のとおりです。
grep -C2 ^[0-9][0-9][0-9][0-9][0-9] emails
このコマンドは、連続する5桁の数字で始まるすべての行とその周辺の2行(-C2
)を提供します。これで実際に住所を見つけることができますが、住所の周りにはまだ不要な行がたくさん表示されます。住所のみを取得するには、検索を指定する必要があります。
それで、5桁の数字で始まり、次の文字で終わる行を検索してみました。
grep -C2 ^´[0-9][0-9][0-9][0-9][0-9][A-Z]$´ emails
しかし、結局何も見つかりませんでした。これは、5文字と1文字のみを含む行を検索するためです。しかし、grep
1行だけを検索するように行検索に指示する方法がわかりません。スタート5桁ありそして 終わる文字(または単語)を使用してください。
次に、最善の試みは、2つの単語のみを含む行を検索して名前と名前を検索することでした。しかし、私はそうする方法がわからず、これを説明する議論を見つけることができません。
あなたが私を助けてくれることを願っていますか?
答え1
grep -B2 -E '^[0-9]{5} +[a-zA-Z]+$'
tryを使用してアドレスブロックのみを見つけることができます。
いくつかの注意:
man grep
オプションについて学ぶには- 正規表現の構文を詳しく説明するマニュアルページを見つけるには、grepのマニュアルページの最後を参照し、GNU grepのマニュアルページ自体で正規表現について少し説明します。
-B
「ゲーム前のライン」、おそらくそれ以上になるでしょう。-C
-E
拡張正規表現構文の場合- 私が提供した正規表現は、5つの数字(
{5}
前の内容を5回許可)、少なくとも1つのスペース(+
前の内容を1回以上許可)、および行の終わりまでの文字のみを含むすべての行と一致します。 - grepのパラメータがどのように引用されているかを確認してください。
`
はい非常に'
またはとは異なります"
。
空白が1つだけ含まれる行を見つける場合は、2つの単語のみを含む行を参照できます。
grep -E '^[^ ]+ [^ ]+'
複数行の項目を一致させたい場合は、できるかどうかわかりませんgrep
。sed
次の行をパターン空間にロードしてから、そのN
接続と一致させる方法を試すことができます(man sed
この方法が適切であることを確認してください)。 (またはperl
複数行のパターンと一致する可能性があるようですが、どうなるかわかりません。)
答え2
それで、5桁の数字で始まり、次の文字で終わる行を検索してみました。
^[0-9][0-9][0-9][0-9][0-9][A-Z]$
このパターンは、以下を含む行と一致します。ただ5桁の数字と1つの(大文字)文字です。その間にさらに多くのコンテンツが必要な場合は、パターンに含める必要があります。関係に興味がない場合は、.*
無制限にすべての文字を一致させるために使用してください。小文字も含めるか、大文字と小文字をgrep -i
無視するために使用する必要があります。
^[0-9]\{5\}.*[A-Za-z]$
次に、最善の試みは、2つの単語のみを含む行を検索して名前と名前を検索することでした。しかし、私はそうする方法がわからず、これを説明する議論を見つけることができません。
start、word、gap、word、endパターンを使用して、2つの単純な単語を含む行を一致させることができます。
^[[:alpha:]]\+[[:space:]]\+[[:alpha:]]\+$
しかし、名前を正規表現と一致させようとすると、多くのトラップがあります。バラよりhttps://stackoverflow.com/questions/2385701/regular-expression-for-first-and-last-name。