将$
放在方括号内不适用于grep。
~ $ echo -e "hello\nthere" > example.txt
~ $ grep "hello$" example.txt
hello
~ $ grep "hello[$]" example.txt
~ $
这是grep中的错误还是我做错了什么?
答案 0 :(得分:8)
这就是它应该做的事情。
[$]
...定义匹配一个字符$
。
因此,这将匹配包含hello$
的行。
请参阅the POSIX RE Bracket Expression definition,了解正式规范要求如此。引用完整定义:
括号表达式(括在方括号中的表达式,“[]”)是一个RE,它与包含在括号表达式所代表的非空整理元素集中的单个整理元素相匹配。
因此,任何括号表达式都匹配单个元素。
此外,在the BRE Anchoring Expression definition:
- 美元符号('$')在用作整个BRE的最后一个字符时应为锚点。当用作子表达式的最后一个字符时,该实现可以将美元符号视为锚点。美元符号应将表达式(或可选的子表达式)锚定到匹配的字符串的末尾;可以说美元符号与最后一个字符后的字符串结尾相匹配。
醇>
因此 - 从BRE开始,grep
默认情况下无正则识别的正则表达式格式 - 如果$
不在表达式的末尾,则不需要将其识别为一个锚。
答案 1 :(得分:0)
但是,您可以在括号分组中使用$
,这有助于使用|
(或),它可以实现与方括号组相同的想法。
您可能会喜欢以下内容:
~ $ cat example.txt
hello
there
helloa
hellob
helloc
~ $ grep "hello\($\|[ab]\)" example.txt
hello
helloa
hellob
答案 2 :(得分:0)
如果要匹配行尾字符或字符串结尾,则可以使用(|),例如“ ABC($ | \ n)”。