2016-06-11 42 views
1

在此之前感谢您的帮助。我对BASH比较陌生,几乎完成了我的第一个shell脚本,但由于其特殊性,遇到了一个我找不到解决方案的问题。这里的问题是:在BASH中搜索近似名称

我已经返回到下面的行从一个文本文件中变量的脚本:

NAME =“科技教育êA·约翰逊”

我需要使用变量来查找文本文件中的以下行并将其分配给同一个变量:

史蒂芬A.约翰逊

我相信, wk可能是正确的功能,但我一直无法弄清楚如何完成这项工作。感谢您的帮助。

+2

'NAME = $ (grep“$ {NAME#}”filename | head -n1)'如果'Steven A. Johnson'本身就存在'filename'中的一行。更具体地说,你需要发布你正在搜索的文件,所以我们不会猜测它的格式。 –

+0

史蒂文A.约翰逊确实出现在自己的路线,但这仍然返回Ste A. A. Johnson。感谢您发布文本文件的提示,我下次肯定会这样做,不幸的是,在这种情况下,超过一半的文本文件中包含必须保密的信息。感谢您的帮助。 –

回答

2

像这样的东西可能会奏效:

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

这将.*取代所有空格name

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

然后可以作为grep的参数。 -m1,可能是一个GNU扩展,只给予第一个匹配。

.*意味着零次或多次匹配任何东西,所以Ste.*e.*A..*Johnson可以匹配:

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