我想匹配一个这样的字符串:
\sf{text}
我写道:
grep -rnw '.' --include \*.tex -o -e '\\sf{text}
但它不会返回任何内容。但是,如果我写
grep -rnw '.' --include \*.tex -o -e '\\sf{text
返回正确的文件。
为什么没有捕获正确的花括号?
答案 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
请注意,花括号不必转义。只是反斜杠。