如何使用sed正则命令实现跨行替换decrypt_aes()包裹的内容
sed 跨行匹配替换实现方案
sed默认按单行逐行处理文本,无法直接识别跨换行的语法结构,针对你要替换的跨行decrypt_aes()包裹场景,可使用以下命令完成替换:
适配固定两行结构的命令
如果你的代码都是固定的「decrypt_aes(单独占一行末尾,token字符串缩进后在下一行,行尾带闭合)」的格式,用这个轻量命令即可:
sed -i 'N;s/decrypt_aes(\n[[:space:]]*\(.*\))/\1/;P;D' 待处理的文件路径
参数说明:
N:将下一行内容追加到当前处理缓冲区,两行内容以换行符\n分隔,实现跨行内容的匹配- 正则部分:匹配
decrypt_aes(+换行+第二行开头的任意缩进空白,捕获引号包裹的token值和末尾的闭合),直接替换为捕获到的token内容 P;D:打印处理完的第一行、删除缓冲区中已处理的第一行内容,循环执行后续逻辑,可支持文件中存在多处同类跨行结构的替换场景
适配非固定格式的通用命令
如果存在缩进不统一、括号和内容之间有空行的情况,可以用循环读行的通用写法,匹配任意跨行的decrypt_aes()包裹结构:
sed -i ':a;N;$!ba;s/decrypt_aes([[:space:]]*\n[[:space:]]*\(.*\))/\1/g' 待处理的文件路径
参数说明:
:a:定义循环标记位N;$!ba:持续将后续行读入处理缓冲区,直到读到文件末尾才停止循环- 正则替换逻辑和单行逻辑一致,只是支持匹配跨换行的空白字符
注意:正式执行原地修改前,可以先去掉命令里的
-i参数运行,预览输出的替换结果是否符合预期,确认无误后再加-i执行原地修改,避免误改文件内容。
内容的提问来源于stack exchange,提问作者tough chow
相关产品推荐
相关产品推荐

