我有一个包含 4 个句子的文本文件,我想 grep 以“me”结尾的句子,但是当我执行 grep“me$”时,它不起作用。
我错过了什么吗?
(我希望结果是第一、第二和第四行)。
编辑:用文本替换图像。
$ cat sm.txt
somebody once told me
somebodyoncetoldme
the world was
gonna roll me
$ grep "me$" sm.txt
$
答案1
在评论中你说将file
文本文件标识为带有 CRLF 行结尾的 ASCII 文本文件。这是另一种说法,它是一个 DOS 文本文件,可能是用 Windows 系统上的编辑器生成的。
与 Unix 文本文件相比,DOS 文本文件在每行末尾、换行符之前有一个额外的回车符。这就是为什么你的正则表达式不匹配,实际上没有行以 结尾me
,它们以 结尾me\r
,其中\r
是编写回车符的常见方法。
解决方法是dos2unix
在 Unix 系统上使用文本文件之前,使用转换工具将其转换为 Unix 文本文件。
答案2
其本身grep "me$"
绝对是正确的。我怀疑您的行以一些难以看到的附加字符结尾,例如制表符和空格。
尝试以下其中一项:
# \t means tab
# [\t ] means a tab or a space
# [\t ]* means any number (including zero) of tabs and spaces.
#
grep "me[\t ]*$" sm.txt
或者:
# [[:space:]] means any white space. I don't know if there are
# more than just space and tabs. This works with GNU grep only.
#
grep "me[[:space:]]*$" sm.txt