18

次のような email.txt という名前のファイルがあります。

Subject:My test
From:my email <myemail@gmail.com>

this is third test

bash スクリプトを使用して、このファイルの電子メール アドレスのみを取り出したいので、このスクリプトを myscript という名前の bash スクリプトに入れます。

#!/bin/bash

file=$(myscript)

var1=$(awk 'NR==2' $file)

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))

echo $var2

しかし、このスクリプトを実行できませんでした。このコマンドを bash で手動で実行すると、電子メール アドレスを取得できます。

echo $var1 | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'

他の関数で使用できるように、変数に格納する電子メール アドレスを配置する必要があります。誰かがこの問題を解決する方法を教えてもらえますか? ありがとう。

4

5 に答える 5

25

これは非常に複雑な方法だと思いますが、スクリプトを機能させたいだけの場合は、これを試してください。

#!/bin/bash

file="email.txt"

var1=$(awk 'NR==2' $file)

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')

echo $var2

何をすべきかfile=$(myscript)はわかりませんが、次の行で への引数としてファイル名が必要なため、 というコマンドを実行するのではなく、 に文字列値としてawk代入する必要があります。はコマンドではありません (テキスト ファイルの単なる 1 行です) 。追加の括弧は冗長です。email.txtfilemyscript$var1echogrepgrep

于 2012-06-12T08:34:01.933 に答える
11

何が起こっているのか:

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'))
       ^^^^^^^ Execute the program named (what is in variable var1).

あなたはこのようなことをする必要があります:

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')

あるいは

var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b')
于 2012-06-12T08:29:45.167 に答える
1

bash には非常に役立つフラグがあります: -xv

との行

var2=$("$var1" | (grep...

する必要があります

var2=$(echo "$var1" | (grep...

また、私のバージョンの grep には -o フラグがありません。

そして、次のコードが実行されても grep パターンが「貪欲」である限り、その出力はまさにあなたが望むものではありません。

#!/bin/bash -xv
file=test.txt
var1=$(awk 'NR==2' $file)

var2=$(echo "$var1" | (grep -Ei '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b'))

echo $var2
于 2012-06-12T08:32:15.900 に答える
0

もっと粗い方法があります:

cat $file | grep @ | tr '<>' '\012\012' | grep @

つまり、@ 記号を含む行を抽出し、山かっこを改行に変えてから、@ 記号が残っているものを再度 grep します。

必要に応じて絞り込みます...

于 2015-02-26T15:00:45.383 に答える