我正在编写一个正在txt文件中搜索的脚本。
所以基本上我有一个循环,从txt文件中获取一个名称,然后在另一个文件(file2)中搜索该名称,但是我遇到了问题。
name=flex
grep $name file2 > file2output
所以如果file2(我在里面搜索的文件) 有类似
的东西 1 flex-inside
2 flex
1 flex-end
当我只希望它与精确的字符串flex匹配时,它将匹配所有这三个。
我希望它只匹配
2 flex
我试图做一些事情,它会寻找$ name中的任何内容然后\ n。但没有任何效果。
感谢您的帮助。
答案 0 :(得分:1)
根据评论,输入文件如下:
$ cat file2
1 flex-inside
3 reflex
2 flex
1 flex-end
我们希望选择与flex
匹配的行,而不是reflex
或flex-end
等。在这种情况下,请尝试:
$ name='flex'
$ grep " $name$" file2
2 flex
这里有两个关键点:
$name
之前有一个空格,以确保reflex
之类的字词不匹配。
$
之后有一个美元符号$name
要求flex
出现在该行的末尾。
以上都假定数字后面的匹配文本不包含空格。例如考虑输入文件:
$ cat file2
1 flex inside
3 re flex
2 flex
1 flexible
我们可以选择匹配flex
的一行:
$ grep -E "^[[:space:]]*[[:digit:]]+[[:space:]]+$name$" file2
2 flex
此处,^[[:space:]]*[[:digit:]]+[[:space:]]+
匹配零个或多个以空格开头的空格,后跟数字后跟一个或多个空格。接下来是$name$
,其中匹配$name
出现在该行的末尾($
)。
使用像[:space:]
和[:digit:]
这样的字符类可以确保此代码是unicode安全的。