$ cat -e test.csv | grep 150463452112
65,150463452112,609848340831,2.87,126,138757585104,0,0,^M$
65,150463452112,609848340832,3.37,126,138757585105,1,0,^M$
$ grep 150463452112 test.csv   | grep '0,^M$'


$

我用Ctrl+V Ctrl+M输入“^M”,并需要将该行与“0,^M$”的结尾匹配。但是,grep返回空行。
问题>搜索结尾的正确语法是什么?
谢谢你
,0,0,在hexdump中看到如下:
2c 30 2c 30 2c 0d 0a

|,0,0,..|

最佳答案

潜在的问题是,您的文件实际上不包含任何两个字符的^M序列(即使它包含了,^对于regex是特殊的,并且与自身不匹配)。相反,它在最后一个换行符之前包含一个回车符(是DOS样式的文本文件,而不是UNIX样式的文本文件)。您想要匹配的不是^M序列,而是一个文本回车。
一种方法是使用bash和kshgrepC样式的字符串文本语法传递一个shell文本:

grep $'0,\r$'

…你可以测试如下:
## test function: generate two lines with CRLFs, one "hello world", the other "foo,0,"
$ generate_sample_data() { printf '%s\r\n' 'hello world' 'foo,0,'; }

## demonstrate that we have 0d 0a line endings on the output from this function
$ generate_sample_data | hexdump -C
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0d 0a 66 6f 6f  |hello world..foo|
00000010  2c 30 2c 0d 0a                                    |,0,..|
00000015

## demonstrate that the given grep matches only the line ending in "0," before the CRLF
$ generate_sample_data | egrep $'0,\r$'
foo,0,

08-27 23:33