bash grep变量作为模式

时间:2015-07-23 10:03:17

标签: bash variables grep

我通常不会使用bash,但在这种情况下,grep可能是一个非常快速的解决方案。我在bash中已经阅读了很多关于grep和变量赋值的问题,但是我没有看到错误。我在$ pattern周围尝试了几种双引号,使用````或$(...)但没有任何效果。

所以这就是我尝试做的事情: 我有两个文件。第一个包含几个名字。我想将它们中的每一个用作grep的模式,以便在另一个文件中搜索它们。因此,我遍历第一个文件的行并将名称分配给变量模式。 此步骤适用于正确打印变量。 但不知何故,grep无法识别/解释变量。当我用实际名称替换“$ pattern”时,一切都很好。因此,我不认为变量赋值有问题,但将“$ pattern”解释为它应该表示的字符串。

非常感谢任何帮助!

#!/bin/bash

while IFS='' read -r line || [[ -n $line ]]; do
    a=( $line )
    pattern="${a[2]}"
    echo "Text read from file: $pattern"
    var=$(grep "$pattern" 9606.protein.aliases.v10.txt)
    echo "Matched Line in Alias is: $var"
done < "$1"


> bash match_Uniprot_StringDB.sh ~/Chromatin_Computation/.../KDM.protein.tb

输出:

Text read from file: "UBE2B" 
Matched Line in Alias is: 
Text read from file: "UTY"
Matched Line in Alias is: 

修改 解决方案drvtiny建议工作。有必要摆脱双引号来匹配字符串。添加以下行使脚本工作。

pattern="${pattern#\"}"
pattern="${pattern%\"}"

1 个答案:

答案 0 :(得分:1)

请查看&#34; -f FILE&#34; man grep中的选项。 我建议这个选项完全符合你的需要,不需要任何bash循环或其他&#34; hacks&#34; :)

是的,根据您的代码输出,您可以读取包含双引号的模式。换句话说,你从文件〜/ Chromatin_Computation /.../ KDM.protein.tb中读取这个字符串:

"UBE2B"

但不是

UBE2B
  • 正如您所料。

也许您需要删除$ pattern边界上的双引号?

阅读模式后尝试执行此操作:

pattern=${pattern#\"}
pattern=${pattern%\"}