在使用 grep 的正则表达式中,以下哪项锚点的使用是正确的?

在使用 grep 的正则表达式中,以下哪项锚点的使用是正确的?

以下两个命令给出相同的输出,但是哪一个是正确的使用方法?

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

进一步阅读:

您可以使用插入符号,'^',作为管道符号“|”的替换。这源于主要的前身 Thompson shell。 (版本 8 shell 是一个例外,它没有广泛分发,在清理设计时删除了此功能。)

相关内容