如何在同一时间使用和不使用正则表达式使用`grep`?

时间:2017-10-27 13:11:37

标签: bash grep

我有一个bash脚本,我在其中使用grep查找文件中的文本(存储在变量中)。

found=$(grep "^$line$" "$file")

现在我的问题是,我需要grep才能使用正则表达式。但是,line有时会包含带有正则表达式关键字的文字,例如[会导致失败grep: Unmatched [

是否有可能让grep不将$line的内容解释为正则表达式?

2 个答案:

答案 0 :(得分:6)

您可以使用-F的{​​{1}}标志使其将模式解释为固定字符串而不是正则表达式。

此外, 如果您希望模式匹配整行(如grep模式所暗示的那样), 您可以与^$line$标志结合使用。

所以你帖子中的命令可以写成:

-x

答案 1 :(得分:-1)

告诉grep所提供的字符是普通字符的方法是正确地逃避它们,例如:

$ cat file
this
[that
not[
$ line=\\[          # escaped to mark [ as an ordinary character
$ grep "$line" file
that[
[not
$ line=[is]         # [ is part of a proper regex 
$ grep "$line" file
this

所以关键是逃避正则表达式字符:

$ line=[
$ echo "${line/[/\\[}"
\[
$ grep "^${line/[/\\[}" file
[that

或者你可以使用awk:

$ line=[that
$ awk -v s="$line" '$0==s' file
[that