grep匹配回车符的问题
2018-01-22 16:06
2735 查看
grep匹配回车符的问题
对于不识别CRLF格式文本文件的grep命令(比如Linux和Cygwin下面的
grep)来说,回车符(carriage return)
\r并不是有特殊含义的字符,而是普通字符,所以如果要匹配回车符,只需要找到一个能够输入回车符这个字符的方式即可,而
bash的
$'\r'就能满足要求。下面举例说明。
CVS在windows的CVS目录下Tag文件是是DOS格式文件文件,把这个文件拷贝到Linux,查看内容如下:
]# cat Tag Trelease ]# cat Tag | od -c 0000000 T r e l e a s e \r \n 0000012
现在要匹配行尾的
e,为了对比,我们还建立一个Tag文件的副本TagUnix,使用
dos2unix命令将它转成Unix风格的文本文件,如下所示:
]# cat TagUnix | od -c 0000000 T r e l e a s e \n 0000011
使用
e$作为模式,结果如下
]# grep e$ Tag ]# grep e$ TagUnix Trelease
这是说明因为Tag的行尾并不是
e,而是
e\r。那么使用
e$'\r'$作为模式如何?结果如下:
]# grep e$'\r'$ Tag ]#
得到一个空行输出。这是为什么?这说明,实际上有一行匹配,但是由于这一行的内容包含
\r,而它对于终端是有特殊含义的,所以终端就在输出
\r的时候,将光标回到行首,于是乎之前输出的内容就看不到,就只能看到一个空行(这似乎说明,Linux下面兼容CRLF格式的不是终端,而是输出文本文件的命令如
more, cat等等)。
解决显式效果的办法也简单,重定向到文件,再输出来,或者直接重定向到
more、
cat等命令(是上面重定向到文件的一种特殊情况),或者通过
tr命令删除
\r,都可以。如下所示:
]# grep e$'\r'$ Tag | more Trelease ]# grep e$'\r'$ Tag | cat Trelease ]# grep e$'\r'$ Tag | tr -d '\r' Trelease
相关文章推荐
- grep匹配CRLF换行符的问题
- grep "5.0" test.txt 匹配问题
- grep查看匹配行的上下行
- gecco爬虫多个HtmlBean 匹配同一个matchUrl的问题
- Prism中在Region中注入匹配问题
- 字符串的匹配问题
- Scanner类的匹配失败问题
- 分享一个shell脚本的坑:grep匹配+wc取值 在脚本执行后的结果与手动执行结果不一致
- linux fgrep命令参数及用法详解---linux查询匹配命令
- 字符串查找匹配问题
- 学习jemeter时遇到的问题(正则表达式格式与匹配)
- 哈希算法在模式匹配问题中的应用
- HDU 2063 过山车(二分图最大匹配问题+最大流 超时解法)
- Spring中的所有路径匹配问题总结
- grep怎样匹配tab键
- 解决js正则匹配换行问题实现代码
- myBatis学习笔记(3)——实体属性名与表字段名不匹配问题
- Linux shell中的一个问题 ${}带正则匹配的表达式
- sed 匹配模式问题
- Android 编译出错版本匹配问题解决办法