You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

脚本逻辑说明

  1. 读取原文件:处理第一个文件(file1.smali)时,将每一行内容存入数组orig,用于后续对比。
  2. 处理目标文件:遍历第二个文件(file2.smali)的每一行:
    • 如果当前行在orig数组中(说明是原文件保留的行),直接输出。
    • 如果是新增行(不在orig数组中),检查是否匹配要删除的正则:匹配则跳过,不匹配则输出。

这个脚本会自动保留修改过的行(修改后的行不在orig数组中且不匹配正则),同时过滤掉符合规则的新增行,完全满足需求。

内容的提问来源于stack exchange,提问作者rmroot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:37:38