$ 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和kshgrep
C样式的字符串文本语法传递一个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,