我想grep
与包含该字符的 PCRE 表达式一起使用<
。 Bash 认为我想要重定向,但我不想。我该如何逃脱<
?
答案1
我可以用反斜杠来做到这一点:
25 % grep \< xmospos.c
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <X11/Xlib.h>
引用的小于号和引用的反斜杠小于号都给出了愚蠢的答案。
答案2
两个简单的规则:
- 反斜杠
\C
转义下一个字符,无论它是什么,除了换行符。 - 单引号
'text'
转义它们之间的任何字符,包括反斜杠,但不包括单引号(因为它标记引用文本的结尾)。
因此:
grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile
如果需要传递包含单引号的参数,可以使用'\''
“转义”单引号内的单引号。从技术上讲,它的作用是结束第一个文字文本,然后将文字放入'
同一个单词中,然后将更多文字文本放在同一个单词中。
grep '^D'\''oh!' myfile
其余引用规则(总结):
- 您至少需要在某些时候引用以下字符:空格和
!"#$&'()*;<>?[\]^`{|}~
(换句话说,以下字符是安全的:字母、数字%+,-./:=@_
和非 ASCII 字符)。 - 在双引号之间,除 and 之外的所有字符均按字面意思使用
"$\`
(在启用历史记录的 shell 中)!
。双引号之间的反斜杠将出现在字符串中,除非它位于非文字字符之一之前。
这些规则适用于 bash 和其他 Bourne 风格的 shell(例如 ash 和 ksh)。它们也适用于 zsh(除了=
空格后面可能需要引用)。 csh/tcsh 和 Fish 中的规则不同。