为什么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