以下两个命令给出相同的输出,但是哪一个是正确的使用方法?
grep ^'\<that\>' file.txt
搜索将其作为第一个单词的行
grep '^\<that\>' file.txt
与前一个输出相同。
将 ^ 锚点放在引号之前或引号内有什么区别?哪一种是合适的?
答案1
命令之间不应该有任何区别。他们都运行完全相同的事情:
$ set -x ## turn on debugging info
$ /bin/grep ^'\<that\>' file.txt
+ /bin/grep '^\<that\>' file.txt
$ /bin/grep '^\<that\>' file.txt
+ /bin/grep '^\<that\>' file.txt
正如您在上面所看到的,两个版本最终都运行完全相同的东西。
也就是说,作为一般规则,将整个正则表达式放在引号内总是更安全,因此使用:
/bin/grep '^\<that\>' file.txt
虽然在这种情况下没有什么区别,但如果正则表达式包含对 shell 来说很重要的字符,则会产生很大的区别。例如:
grep ;'foo' file
在这里,shell 会将 解释;
为控制字符并运行两个命令:(grep
不带参数)和'foo' file
。
答案2
如果将“^”放在引号之外,您的 shell 可能会将其解释为重定向。引用它可以避免这个问题。这被认为是过时的,但你可以找到它,例如,在鱼的变更日志:
插入符号
^
现在仅当 stderr 是令牌的第一个字符时才会进行重定向,这让 git 用户感到高兴 #168
进一步阅读:
- 传统 Bourne shell 的典型共同属性
斯文·马斯切克 (Sven Mascheck) 指出:
您可以使用插入符号,
'^'
,作为管道符号“|”的替换。这源于主要的前身 Thompson shell。 (版本 8 shell 是一个例外,它没有广泛分发,在清理设计时删除了此功能。)