0

私は bash スクリプトにあまり慣れていませんがtextfile.txt、これらのパターンが数回出現する複数の行で構成される名前とメールを含むファイルがあるとします。

name@surname.net;othername.othersurname;name@surname.net;othername.othersurname;name@surname.net;...

メール以外のすべてのエントリをこのリストから除外したいと思います。実行可能ファイルが file.sh で、sh file.sh textfile.txt を実行するとします。

#!/bin/bash

if [–f $1];

awk -F ";" '{//here comes what I am looking for
}' $1

else 

echo "there is no such file"

fi

最後にフィルタリングされたエントリを取得できる構文がわかりません(@リストから削除する兆候がないかどうかを確認するため)。私はそれをグーグルで試しましたが、成功しませんでした

4

3 に答える 3

1

申し訳ありませawkんが、perlでそれを行うことができます

perl -p -e 's/;[^;@]+;/;/g'

しかし、これにはバグが 1 つあります。行の最初または最後のエントリが無効な電子メールである場合、それを見逃すことになります。これらを適切に解決するには、単一行として乱雑になり始める分割/チェック/結合が必要です

perl -p -e 'join(";",grep(/@/,split(";",$_)))'

編集: おっと、申し訳ありませんが、ideone からコマンド ラインに切り替える際の間違いです。への割り当てがありませんでし$_た。-p

perl -p -e '$_ = join(";",grep(/@/,split(";",$_)))'
  • split(";",$_)を区切り文字として使用して、現在の行 ( $_) を要素の配列に分割し;ます。
  • grep(/@/,...)を含む配列の要素のみを返します@。これは、有効な電子メール アドレスの簡単なテストでした。より徹底したい場合は、より厳密な正規表現を電子メール アドレスに使用できます。多分/^[^\s@]+@[^\s@]+\.[^\s@]+$/
  • 次に、join(";"...)有効な電子メール アドレスを;区切り文字列に再結合します。
于 2013-05-30T16:26:02.110 に答える
0

ここにawk解決策があります。ただし、 のみawkなので、シェル スクリプト内に含めることはお勧めしません。コマンドラインから実行すると動作するはずです:

awk '

    ## Split (in input) and join (in output) fields with colon.
    BEGIN { FS = OFS = ";" }
    {   
        ## Traverse all fields and delete those that do not contain one "@".
        for ( i = 1; i <= NF; i++ ) { if ( index( $i, "@" ) == 0 ) { $i = "" } } 

        ## There will be some consecutive colons between those fields deleted.
        ## Keep only one.
        gsub( /;{2,}/, ";" )

        ## Print the whole line only with emails.
        print
    }   

' infile

あなたの例の行では、次のようになります。

name@surname.net;name@surname.net;name@surname.net
于 2013-05-30T21:22:05.040 に答える