像这样的东西可能会奏效:
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
'NAME = $ (grep“$ {NAME#}”filename | head -n1)'如果'Steven A. Johnson'本身就存在'filename'中的一行。更具体地说,你需要发布你正在搜索的文件,所以我们不会猜测它的格式。 –
史蒂文A.约翰逊确实出现在自己的路线,但这仍然返回Ste A. A. Johnson。感谢您发布文本文件的提示,我下次肯定会这样做,不幸的是,在这种情况下,超过一半的文本文件中包含必须保密的信息。感谢您的帮助。 –