如何 grep 以特定表达式结尾的行

如何 grep 以特定表达式结尾的行

我有一个包含 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

相关内容