我怎样才能 grep '^M$'?

我怎样才能 grep '^M$'?

我正在尝试从字幕 (.srt) 文件中提取行。当我 grep 查找特定行号时,我得到了我期望的答案:

% grep -e "^817" ponyo.srt                                             
817
%

但是当我尝试 grep 查找包含回车符(或回车符和 EOL)的该行时,我得到一个空行:

% grep -e "^817\r" ponyo.srt 

% grep -e "^817^M$" ponyo.srt

%

这是使用“cat -e”显示隐藏字符的文本文件:

% cat -e ponyo.srt 
1^M$
00:04:38,478 --> 00:04:43,381^M$
The Beginning^M$
^M$
2^M$
00:04:44,751 --> 00:04:51,122^M$
PONYO ON THE CLIFF BY THE SEA^M$
^M$
474^M$
01:00:23,016 --> 01:00:25,041^M$
Stay here with Ponyo.^M$
^M$
475^M$
01:00:25,285 --> 01:00:28,618^M$
I'm going too.^M$
Let's take Ponyo with us.^M$
^M$
817^M$
01:40:08,532 --> 01:40:13,834^M$
<i>Oh he 's my favorite little boy</i>^M$
^M$
823^M$
01:40:32,456 --> 01:40:38,156^M$
Studio Ghibli^M$
^M$
824^M$
01:40:39,530 --> 01:40:42,624^M$
The End^M$
^M$
825^M$
01:40:42,766 --> 01:40:45,792^M$
English translation by^M$
Jim Hubbert and Rieko Izutsu-Vajirasarn^M$
English subtitles by^M$
Aura^M$
^M$
%

如何 grep 查找行尾并在结果中获取整行?

编辑:要补充的是,正如我所期望的那样,仅搜索 EOL 不会返回任何结果:

% grep -e "^817$" ponyo.srt 
%

答案1

(感谢 @steeldriver 的答案。)

正如中提到的这个帖子 grep --color更改 grep 将响应写入终端的方式,从而干扰写入^M屏幕。我alias grep='grep --color=auto'在 bash 设置中使用。为了绕过别名,既解决此问题又创建永久解决方案,我曾经\让 shell 使用不带别名的 grep。

% \grep -e "^817^M" ponyo.srt
817
% 

答案2

有两件事似乎导致了挂起 - 首先,您使用了双引号,这意味着 shell 将解释某些内容而不是逐字传递它们。其次,您可能需要用 \ 转义美元符号,因为即使使用单引号,我的 shell 也无法正确搜索。更改这些参数后,grep实际上会返回您正在寻找的行(或者至少对我来说是这样)。

相关内容