shell sed命令实现自动化批量修改文本文件中首个匹配到的关键字

awk + sed联手干大事

开门见山上代码

powershell 复制代码
#! /bin/bash

CURENT_PATH=`pwd`
FILE_NAME="main.c"
LINE_NUM=`grep "#include" -inr ${FILE_NAME} | awk -F: 'NR==1{print $1}' `
SED_CMD="{${LINE_NUM}s/#include/#pragma\ SET_CODE_SECTION(\".textL2\")\r\n#pragma\ SET_DATA_SECTION(\".dataL2\")\r\n#include/g}"
#SED_CMD="/#include/{${LINE_NUM}s/#include/#pragma\ SET_CODE_SECTION(\".textL2\")\r\n#pragma\ SET_DATA_SECTION(\".dataL2\")\r\n#include/p;q}"
cat $FILE_NAME | sed "${SED_CMD}" > ./222/$FILE_NAME

三大金刚分解

功能很牛逼,关键过程就三条,先来看看各部的执行结果吧

1.grep文本匹配搜索

powershell 复制代码
grep "#include" -inr ${FILE_NAME}

从main.c中搜索包含"#include"字符串的行并显示行号

-in 显示行号

  • r 从当前传入的目录递归往里搜

执行结果:

复制代码
6:#include <stdio.h>
7:#include <stdio.h>
8:#include <stdio.h>`
9:#include <stdio.h>
10:#include <stdio.h>

2.awk提取参数

awk 会根据指定的分隔符将输入的字符串像制表符一样把它分成行列矩阵

bash 复制代码
awk -F: 'NR==1{print $1}'

-F 用来指定分隔符

NR==1 表示只处理第1行

{}里面是执行的动作,即打印出提取到的第一个参数

执行结果:

matlab 复制代码
$ grep "#include" -inr main.c | awk -F: '{print $1}'
6
7
8
9
10
commonlisp 复制代码
$ grep "#include" -inr main.c | awk -F: 'NR==1{print $1}'
6

3.sed模拟vi进行编辑修改

sed命令是一个非交互式的行文本编辑器,它能对文件内容进行编辑,默认每次处理文本文件中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把模式空间里面的内容输出到屏幕上,然后把模式空间中的内容删除,同时把下一行所匹配到的内容读入模式空间内,依次循环,直到读取完整个文件。

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d :删除,因为是删除啊,所以 d 后面通常不接任何东东;

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

bash 复制代码
sed  '{${LINE_NUM}s/#include/#pragma\ SET_CODE_SECTION(\".textL2\")\r\n#pragma\ SET_DATA_SECTION(\".dataL2\")\r\n#include/g} '

bash 复制代码
sed {6s/#include/#pragma\ SET_CODE_SECTION(".textL2")\r\n#pragma\ SET_DATA_SECTION(".dataL2")\r\n#include/g}

6s 表示限定处理范围,只处理第六行

末尾的/g表示全局替换

6s/要搜索的字符串/替换成的字符串/g

中间"替换成的字符串"里头的\是连字符

最终效果

原main.c

$ cat main.c

c 复制代码
/* asdfgk */




#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>

int main()
{
return 1;
}

执行该脚本后的main.c

$cat 222/main.c

c 复制代码
/* asdfgk */




#pragma SET_CODE_SECTION(".textL2")
#pragma SET_DATA_SECTION(".dataL2")
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>

int main()
{
return 1;
}
相关推荐
sxstj8 小时前
Ubuntu 完整安装并启用 Flatpak 教程
linux·运维·ubuntu
国际云,接待8 小时前
Nginx 后面接负载均衡,502/504 到底该先查哪里?
运维·nginx·负载均衡
天疆说8 小时前
Ubuntu 26.04 下 Intel Meteor Lake 核显 + NPU 驱动配置与 PyTorch NPU 推理实测
linux·pytorch·ubuntu
mounter6259 小时前
突破单点限制:BPF 多跟踪点高效附加机制与新 ftrace 架构解析
linux·ebpf·linux kernel·kernel·ftrace
刘某的Cloud9 小时前
Galera Cluster部署 mariadb 节点down机,log sequence number恢复
linux·运维·数据库·负载均衡·mariadb·集群·高可用
小此方9 小时前
Re:Linux系统篇(五十四)线程篇 · 七:互斥锁的底层实现原理:从硬件上下文、原子交换指令(Swap)到并发封装实战
linux·运维·驱动开发
测试_AI_一辰9 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
郭涤生9 小时前
rootfs 详解与裁剪优化记录
linux·c++·bsp
学习和思考10 小时前
非自动化专业如何自学PLC?我的6个月学习路线图
笔记·学习·自动化·学习方法
铁锚10 小时前
解决Ubuntu执行sudo时 unable to resolve host 报错问题
linux·数据库·ubuntu