使用变量(grep)在文件中查找确切的字符串

时间:2018-02-15 21:50:03

标签: bash grep

我正在编写一个正在txt文件中搜索的脚本。

所以基本上我有一个循环,从txt文件中获取一个名称,然后在另一个文件(file2)中搜索该名称,但是我遇到了问题。

name=flex

grep $name file2 > file2output

所以如果file2(我在里面搜索的文件) 有类似

的东西
    1 flex-inside

    2 flex

    1 flex-end

当我只希望它与精确的字符串flex匹配时,它将匹配所有这三个。

我希望它只匹配

2 flex

我试图做一些事情,它会寻找$ name中的任何内容然后\ n。但没有任何效果。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

根据评论,输入文件如下:

$ cat file2
    1 flex-inside
    3 reflex
    2 flex
    1 flex-end

我们希望选择与flex匹配的行,而不是reflexflex-end等。在这种情况下,请尝试:

$ name='flex'
$ grep " $name$" file2
    2 flex

这里有两个关键点:

  1. $name之前有一个空格,以确保reflex之类的字词不匹配。

  2. $之后有一个美元符号$name要求flex出现在该行的末尾。

  3. 扩展版本:处理嵌入式空间

    以上都假定数字后面的匹配文本不包含空格。例如考虑输入文件:

    $ 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安全的。