Cygwin下如何实现多模式文本行的部分匹配过滤?
解决Cygwin下多模式部分匹配过滤行的问题
问题根源
你遇到的grep -vf结果随模式顺序变化的异常,大概率是Windows格式文本的CRLF换行符导致的。Windows下保存的remove.txt每行末尾是\r\n(CRLF),Cygwin的grep会把\r当成模式的一部分,导致部分模式匹配失效(比如模式变成Word\r,无法匹配Word1)。循环grep -vF是整行匹配,自然无法实现部分匹配。
可行方案
方案1:修复文本格式后用grep
先将remove.txt转成Unix格式(LF换行),再用grep过滤:
- 安装
dos2unix(如果未安装,通过Cygwin的setup.exe搜索安装) - 转换文件格式:
dos2unix remove.txt - 执行过滤命令:
grep -vf remove.txt input.txt > output.txt
方案2:用awk直接处理(无需修改文件)
awk不受Windows换行符影响,直接读取模式并过滤:
awk 'NR==FNR{pat[$0]; next} {for(p in pat) if(index($0,p)) next; print}' remove.txt input.txt > output.txt
- 逻辑说明:先读取
remove.txt的所有模式存入数组pat;再遍历input.txt,若行中包含任意模式则跳过,否则输出该行。
方案3:sed多模式写法(手动指定模式)
如果不想用awk或修改文件,也可以手动把模式写到sed命令里:
sed '/Word/d;/Sentence/d;/Number/d' input.txt > output.txt
这种写法适合模式较少的场景,无需依赖外部文件格式。
验证结果
执行上述任一命令后,output.txt应仅保留College和School两行。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

