如何在BASH中删除两个smali文件中匹配正则的新增行
用BASH删除Smali文件中特定新增行
需求概述
有两个初始内容一致的.smali文件,文件2存在部分新增行。需要删除文件2中**属于新增行且匹配正则const/\d\sv\d,\s0x\d**的行,具体规则:
- 匹配
const/4 v1, 0x0格式的新增行必须删除 - 包含
c的行(如const/4 c1, 0x0)即使结构类似也不删除 - 修改过的行(如与文件1对应行内容不同的
invoke-direct行)必须保留
原始文件内容
文件1(file1.smali)
# direct methods .method public constructor <init>()V .locals 1 invoke-direct {p0}, Ljava/lang/Object;-><init>()V return-void .end method
文件2(file2.smali)
# direct methods .method public constructor <init>()V .locals 1 const/4 v1, 0x0 invoke-direct {p7}, Ljava/lang/Object;-><init>()V const/4 c1, 0x0 return-void .end method
期望输出
# direct methods .method public constructor <init>()V .locals 1 invoke-direct {p7}, Ljava/lang/Object;-><init>()V const/4 c1, 0x0 return-void .end method
解决方案:使用AWK脚本
可以用一个AWK脚本一次性对比两个文件,过滤掉符合条件的新增行:
awk ' NR==FNR { orig[$0]; next } { if ($0 in orig) { print next } if (!/const\/[0-9]\s+v[0-9],\s+0x[0-9]/) { print } } ' file1.smali file2.smali > output.smali
脚本逻辑说明
- 读取原文件:处理第一个文件(file1.smali)时,将每一行内容存入数组
orig,用于后续对比。 - 处理目标文件:遍历第二个文件(file2.smali)的每一行:
- 如果当前行在
orig数组中(说明是原文件保留的行),直接输出。 - 如果是新增行(不在
orig数组中),检查是否匹配要删除的正则:匹配则跳过,不匹配则输出。
- 如果当前行在
这个脚本会自动保留修改过的行(修改后的行不在orig数组中且不匹配正则),同时过滤掉符合规则的新增行,完全满足需求。
内容的提问来源于stack exchange,提问作者rmroot
相关产品推荐
相关产品推荐

