如何用grep匹配含特定格式目标文件名的行?及通配符用法咨询
问题描述
我想在file.txt中用grep搜索同时包含cp和特定格式目标文件名的行,文件内的行格式为:
cp (source file name) (target file name)
目标文件名的固定格式要求:/path/to/file/TC_12_IT_(6位数字)_(6位数字)_*TC_12_TEST*_(2位数字).tc12.tc12
当前使用的grep命令:
grep -E cp.*/path/to/file/TC_12_IT_ file.txt
想问两个问题:
- 如何写出更精准匹配目标文件名完整格式的grep命令?比如类似以下写法但更准确:
grep -E 'cp.*/path/to/file/TC_12_IT_*_*_TC_12_TEST_*.tc12.tc12' file.txt
- grep里能不能像
ls那样用通配符(比如ls -lrt TC_12_*_12345678.txt)搜索文件内容?还有其他可行的实现方法吗?
解决方案
一、精准匹配目标文件名的grep命令
你需要用正则表达式替代shell通配符(正则里的*是匹配前一个字符0次或多次,和shell通配符含义完全不同)。针对你的格式要求,正确的扩展正则命令如下:
grep -E 'cp.*\/path\/to\/file\/TC_12_IT_[0-9]{6}_[0-9]{6}_.*TC_12_TEST.*_[0-9]{2}\.tc12\.tc12' file.txt
关键部分解释:
[0-9]{6}:精准匹配6位数字[0-9]{2}:精准匹配2位数字.*:匹配任意字符0次或多次(对应格式里的可变部分*)\/:转义斜杠,避免被正则解析为特殊符号\.:转义点号,确保匹配实际的文件后缀点
如果要让匹配更严谨(比如避免目标文件名和其他内容混淆),可以增加空格或行尾判断:
grep -E 'cp.*\s\/path\/to\/file\/TC_12_IT_[0-9]{6}_[0-9]{6}_.*TC_12_TEST.*_[0-9]{2}\.tc12\.tc12(\s|$)' file.txt
这里\s匹配空格,$匹配行尾,确保目标文件名是独立的参数。
二、grep中使用类似ls的通配符?
grep默认用正则表达式匹配内容,无法直接使用ls那样的shell通配符(shell通配符是用来匹配文件名的,不是文件内容),但可以通过以下方式实现类似效果:
- 将shell通配符转译为正则
比如ls里的TC_12_*_12345678.txt,对应正则就是TC_12_.*_12345678\.txt,用grep执行:
grep -E 'TC_12_.*_12345678\.txt' file.txt
- 其他可行实现方法
- awk过滤:awk的正则支持同样灵活,适合复杂格式匹配:
awk '/cp.*\/path\/to\/file\/TC_12_IT_[0-9]{6}_[0-9]{6}_.*TC_12_TEST.*_[0-9]{2}\.tc12\.tc12/' file.txt
- sed过滤:sed也可以提取符合条件的行,注意sed中量词
{}需要转义(或加-E选项):
sed -n '/cp.*\/path\/to\/file\/TC_12_IT_[0-9]\{6\}_[0-9]\{6\}_.*TC_12_TEST.*_[0-9]\{2\}\.tc12\.tc12/p' file.txt
内容的提问来源于stack exchange,提问作者prashant
相关产品推荐
相关产品推荐

