我有一个bash脚本,我在其中使用grep查找文件中的文本(存储在变量中)。
found=$(grep "^$line$" "$file")
现在我的问题是,我需要grep才能使用正则表达式。但是,line
有时会包含带有正则表达式关键字的文字,例如[
会导致失败grep: Unmatched [
。
是否有可能让grep不将$line
的内容解释为正则表达式?
答案 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