2016-06-11 2 views
1

おかげさまでありがとうございました。私はBASHには比較的新しく、最初のシェルスクリプトをほぼ完成させましたが、その特異性のために解決策を見つけることができないという問題にぶつかってきました。ここでの問題は、次のとおりです。BASHで似たような名前を検索

私は変数にテキストファイルから次の行に返すスクリプトがあります。

NAME =「サント電子のA.ジョンソン」

私はそれを使用する必要がありますが

スティーブンA.ジョンソン

私はと信じている:テキストファイル内の次の行を見つけ、同じ変数に代入する変数wkは適切な機能かもしれませんが、私はその作業を行う方法を理解することができませんでした。お手伝いありがとう。このような

+2

'NAME = $

.*のでSte.*e.*A..*Johnsonを一致させることができ、何も0回以上一致する意味します'Steven A. Johnson'が' filename'の行として単独で存在するならば、(grep "$ {NAME#}" filename | head -n1) '具体的には、探しているファイルを投稿して、その形式を推測しないようにする必要があります。 –

+0

Steven A. Johnsonはそれ自身の行に現れますが、これはまだSte e A. Johnsonを返します。テキストファイルを投稿していただきありがとうございます。次回は間違いなくこの場合、テキストファイルの半分以上が機密情報である必要があります。しかし、助けてくれてありがとう。 –

答えて

2

何かがうまくいくかもしれない:これは.*nameにすべてのスペースを置き換えます

name="Ste e A. Johnson" 
name=${name// /.*} 
found_name=$(grep -m1 -- "$name" filename) 

:その後、grepのための引数として使用することができ

Ste e A. Johnson -> Ste.*e.*A..*Johnson 

を。 -m1は、GNUの拡張機能である可能性があります。

Steven A. Johnson 
# But also 
SteeA.Johnson 
Steeeeeeeeven A. Johnson 
This line will Ste also be matched, Ah I understand Johnson 
... 

を実際A..のみリテラル.に一致するようにエスケープする必要があります:

name="Ste e A. Johnson" 
name=${name//./\\.} 
name=${name// /.*} 
printf "%s\n" "$name" 
Ste.*e.*A\..*Johnson 
#  ^Now the . is literal 
関連する問題