为什么grep不识别右曲括号?

为什么grep不识别右曲括号?,grep,pattern-matching,Grep,Pattern Matching,我想匹配如下字符串: \sf{text} 我写道: grep -rnw '.' --include \*.tex -o -e '\\sf{text} 但它不会返回任何内容。但是如果我写 grep -rnw '.' --include \*.tex -o -e '\\sf{text 它返回正确的文件 为什么没有捕获右花括号?既然您正在寻找固定字符串,最好使用-F而不是-e: grep -F '\sf{text}' files 这样,您就不必担心转义字符、特殊含义等问题 从man grep:

我想匹配如下字符串:

\sf{text}
我写道:

grep -rnw '.' --include \*.tex -o -e '\\sf{text}
但它不会返回任何内容。但是如果我写

grep -rnw '.' --include \*.tex -o -e '\\sf{text
它返回正确的文件


为什么没有捕获右花括号?

既然您正在寻找固定字符串,最好使用
-F
而不是
-e

grep -F '\sf{text}' files
这样,您就不必担心转义字符、特殊含义等问题

man grep

匹配器选择

-F,--固定字符串

将模式解释为由新行分隔的固定字符串列表, 任何一个都是匹配的。(-F由POSIX指定。)

而您正在使用的
-e
,则使用字符串作为模式,因此它具有特殊的含义

匹配控件

-e模式,--regexp=PATTERN

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


更新
如何替换匹配的模式?在所有他们发现的文件中 一定要包含此图案删除它并替换为另一个图案

我将使用
find
获取文件,并使用
sed
替换内容

find . -type f -exec sed -i.bak 's/\\sf{text}/XXX/g' {} +
例子
请注意,不必转义大括号。只有反斜杠。

您是在寻找固定文本还是变量?如果我写了一个确切的例子,一些示例输入可能会有所帮助。我正在寻找\sf{text}它也不起作用。即使我的工作示例没有右方括号,也会出现错误。grep:“\sf{text:没有这样的文件或目录”我已经“清理”了解决方案,只清理了
-F
。您使用的其他标志我不清楚它们是否必要(我需要更多信息)。好的,但是有更通用的解决方案吗?作为一种模式,如果您只是查找包含此字符串的所有文件,请使用
grep-rF'\sf{text}'*
。请注意,此
*
是以前缺少的。如何替换匹配的模式?
$ cat a
sdi
asd \sf{text} asdf
ads
$ sed 's/\\sf{text}/XXX/g' a
sdi
asd XXX asdf
ads