如何使用grep仅删除行内精确匹配项而非删除整行
解决方案
你之前用的grep -wvf是整行维度过滤,命中匹配就删除整行,不符合你行内删除匹配词的需求,下面是两种无需shell层面for循环的实现方案:
方案1:awk 实现(推荐,无需处理正则转义)
awk 'NR==FNR {pattern[$0]=1; next} { res = "" for(i=1;i<=NF;i++) { if (!pattern[$i]) { res = res " " $i } } sub(/^ /, "", res) print res }' patterns.txt FILE.txt
实现逻辑:
- 先读取
patterns.txt的所有内容存入哈希表pattern - 逐行处理
FILE.txt时遍历每个字段,仅保留不在匹配表中的字段,最后拼接输出并去掉行首多余空格 - 该方案是精确匹配整个字段,哪怕模式包含正则特殊字符也不会出错
方案2:sed 实现
sed -f <(sed 's/[^^]/[&]/g;s/\^/\\^/g' patterns.txt | sed 's/^/s\/\b/;s/$\/\b\/g/') FILE.txt | sed 's/^ *//;s/ */ /g;s/ *$//'
实现逻辑:
- 先用进程替换将
patterns.txt的每一行转义正则特殊字符后,生成s/\b匹配词\b//g格式的全局替换规则 - 调用sed执行所有替换规则后,再清理多余的空格即可
注:两种方案均未使用shell层面的for循环,执行效率远高于逐行读取的shell循环实现。
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

