问题描述
将$
放在方括号中不适用于grep。
~ $ echo -e "hello
there" > example.txt
~ $ grep "hello$" example.txt
hello
~ $ grep "hello[$]" example.txt
~ $
这是grep中的错误还是我做错了什么?
推荐答案
这就是它应该执行的操作。
[$]
...定义与一个字符$
匹配的字符类。
因此,这将匹配包含hello$
的行。
有关要求这样做的正式规范,请参阅POSIXRE括号表达式定义。引用该完整定义:
括号表达式(括在方括号中的表达式,"[]")是一个RE,它应该与括号表达式表示的非空排序元素集中包含的单个排序元素相匹配。
因此,任何括号表达式都与单个元素匹配。
此外,中的BRE锚定表达式定义:
美元符号(‘$’)用作整个BRE的最后一个字符时应为锚点。在用作子表达式的最后一个字符时,该实现可以将美元符号视为锚点。美元符号应将表达式(或可选子表达式)锚定到要匹配的字符串的末尾;美元符号可以说与最后一个字符后面的字符串末尾匹配。因此--从bre开始,grep
默认识别的regexp格式不带参数--如果$
不在表达式末尾,则不需要将其识别为锚。