行尾char($)在方括号内不起作用

问题描述 投票:4回答:3

$放在方括号内不适用于grep。

~ $ echo -e "hello\nthere" > example.txt
~ $ grep "hello$" example.txt 
hello
~ $ grep "hello[$]" example.txt 
~ $ 

这是grep中的错误还是我做错了什么?

regex grep
3个回答
8
投票

这就是应该做的。

[$]

...定义匹配一个字符$的字符类。

因此,这将匹配包含hello$的行。


请参阅the POSIX RE Bracket Expression definition的正式规范,要求这样做。引用完整定义:

括号表达式(括在方括号中的表达式,“[]”)是一个RE,它与包含在括号表达式所表示的非空整理元素集合中的单个整理元素相匹配。

因此,任何括号表达式都匹配单个元素。


而且,在the BRE Anchoring Expression definition:

  1. 当用作整个BRE的最后一个字符时,美元符号('$')应该是一个锚点。当用作子表达式的最后一个字符时,该实现可以将美元符号视为锚点。美元符号应将表达式(或可选的子表达式)锚定到匹配的字符串的末尾;可以说美元符号与最后一个字符后面的字符串结尾相匹配。

因此 - 从BRE开始,grep默认情况下不识别参数的正则表达式格式 - 如果$不在表达式的末尾,则不需要将其识别为锚点。


0
投票

但是,您可以在括号分组中使用$,这有助于使用|(或),它可以实现与方括号组相同的想法。

您可能会对以下内容感兴趣:

~ $ cat example.txt 
hello
there
helloa
hellob
helloc

~ $ grep "hello\($\|[ab]\)" example.txt
hello
helloa
hellob

0
投票

如果您正在尝试匹配行尾字符或字符串结尾,则可以使用(|),如此“ABC($ | \ n)”。

© www.soinside.com 2019 - 2024. All rights reserved.