为什么grep无法识别正确的大括号?

时间:2015-04-17 10:28:41

标签: grep pattern-matching

我想匹配一个这样的字符串:

\sf{text}

我写道:

grep -rnw '.' --include \*.tex -o -e '\\sf{text}

但它不会返回任何内容。但是,如果我写

grep -rnw '.' --include \*.tex -o -e '\\sf{text

返回正确的文件。

为什么没有捕获正确的花括号?

1 个答案:

答案 0 :(得分:2)

由于您正在寻找固定字符串,因此最好使用-F代替-e

grep -F '\sf{text}' files

这样您就不必担心转义字符,特殊含义等等。

来自man grep

  

匹配器选择

     

-F , - 固定字符串

     

将PATTERN解释为固定字符串列表,以换行符分隔,   其中任何一个都要匹配。 (-F由POSIX指定。)

而您使用的那个-e使用字符串作为模式,因此它的特殊含义。

  

匹配控制

     

-e PATTERN, - regexp = PATTERN

     

使用PATTERN作为模式。这可以用于指定多个   搜索模式,或保护以连字符( - )开头的模式。   (-e由POSIX指定。)


更新

  

我如何更换匹配模式?在他们的所有文件中   确实包含此模式删除它并将其替换为另一个模式。

我会使用find来获取文件,并使用sed来替换内容。

find . -type f -exec sed -i.bak 's/\\sf{text}/XXX/g' {} +

实施例

$ cat a
sdi
asd \sf{text} asdf
ads
$ sed 's/\\sf{text}/XXX/g' a
sdi
asd XXX asdf
ads

请注意,花括号不必转义。只是反斜杠。