如何使用grep同时搜索换行符与空字符(适配UTF-16小端场景)
解决UTF-16小端文件中匹配
0A 00换行符序列的问题 针对你在批量检查UTF-16小端格式文件时,无法匹配换行符对应的0A 00字节序列的问题,这里有几个可行的解决方案,结合grep和批量处理工具来实现:
方法1:用grep直接匹配字节序列(推荐)
你可以利用grep的Perl正则模式(-P)配合强制文本模式(-a)来直接定位目标字节序列,同时加上递归搜索(-r)来批量处理目录下的所有文件:
grep -r -P -a '\x0A\x00' /path/to/your/target/directory
如果需要匹配一个或多个连续的换行符(也就是0A 00重复出现),只需要把正则改成重复模式:
grep -r -P -a '(\x0A\x00)+' /path/to/your/target/directory
为什么这个命令有效?
-r:递归遍历目标目录下的所有文件,满足你批量检查的需求-P:启用Perl正则,支持\xXX格式的十六进制字节匹配-a:强制grep将所有文件视为文本文件,不会跳过被识别为二进制的UTF-16文件\x0A\x00:精确对应UTF-16小端格式中换行符的字节序列
如果上面的命令效果不佳,可以尝试替换-a为-U(二进制模式,不转换换行符):
grep -r -P -U '\x0A\x00' /path/to/your/target/directory
方法2:用find+xxd做精确十六进制搜索
如果grep的字节匹配还是有问题,可以借助xxd将文件转换为十六进制字符串,再进行搜索,适合更精准的字节级匹配:
find /path/to/your/target/directory -type f -exec sh -c 'xxd -p "$1" | grep -q "0a00"' _ {} \; -print
命令解释:
find:遍历目标目录下的所有普通文件(-type f)xxd -p:将文件内容转换为无格式的纯十六进制字符串(默认小写,所以搜索0a00)grep -q:静默搜索,找到匹配内容就返回成功-print:当文件匹配时,打印文件名
如果要匹配多个连续换行符,把grep -q "0a00"改成grep -q "0a00\{1,\}"即可。
内容的提问来源于stack exchange,提问作者user7394862




