前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用sed和awk查找和替换字符串处理Makefile文件(三)

使用sed和awk查找和替换字符串处理Makefile文件(三)

作者头像
typecodes
发布2024-03-29 14:56:08
1370
发布2024-03-29 14:56:08
举报
文章被收录于专栏:typecodestypecodes

在前文中演示了使用awk和sed命令正则查找和替换Makefile文件中的make clean操作规则:把-(RM) (ULT_BIN)和-(RM) (ULT_BIN)这两句写成一句-(RM) (ULT_BIN)

使用sed和awk查找和替换字符串处理Makefile文件(三)
使用sed和awk查找和替换字符串处理Makefile文件(三)
1 具体功能需求

要实现的效果如果上图所示,左边表示之前的Makefile文件,右边是通过本次Shell脚本处理后的Makefile文件,红色部分就是需要点。具体如下:

需求1:

之前这个Makefile脚本在生成多个可执行文件时会调用gen_excbin包,然后执行*.o的生成规则,但是由于它前面加了$(CURDIR)/变量,而%.cpp.c前面没有加,所以不会调用gen_depend包生成.d依赖文件了,而是按照默认隐含的gcc或者g++编译规则生成.o文件。所以为了批量替换掉虚拟机中项目现有所有的Makefile文件,BZ选择用包含sedawk命令的shell脚本来处理。

需求2:

每调用gen_excbin或者gen_libs包生成可执行文件或者库文件后(即

@和

@

需求3:

替换掉原来的(bin).o为 (CURDIR)/

2 shell程序

下面的这份shell脚本比较简单,直接运行./sedawkfindreplace3.sh即可。同前文的脚本框架一样,这里先使用for ... in的Makefile文件遍历中,然后利用了awk命令的正则匹配查找、替换操作,然后是sed命令执行正则匹配查找、替换以及追加操作。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

#!/bin/bash # FileName: sedawkfindreplace3.sh # Description: Basic usage of sed and awk command such as find and replace words in the regular expression. # Simple Usage: ./sedawkfindreplace1.sh # (c) 2017.5.22 vfhky https://typecodes.com/linux/sedawkfindreplace3.html # https://github.com/vfhky/shell-tools/blob/master/filehandle/sedawkfindreplace3.sh # Dir to be handled for windows. # SRC_DIR="/e/typecodes.com/vfhky/src" # Dir to be handled for Linux. SRC_DIR="/home/vfhky/src" # The makefile you want to modify. SEARCH_NAME="Makefile*" # The maximum depth of the dirs where files such as Makefile you're dealing with lies in. MAXDEPTH=10 # Get the target files you want to modify. ALL_MAKEFILE=$(find ${SRC_DIR} -maxdepth ${MAXDEPTH} -type f -name "${SEARCH_NAME}") # Traverse the target files. for FILE in ${ALL_MAKEFILE} do echo -e 'Handling file='${FILE}'' #### Ways recommended: find "-$(RM) $(ULT_BIN)" by awk command. #awk '/\$(CURDIR)\/\%.o\: \%.cpp/{printf( "%s:%d: %s\n", FILENAME, NR, $0) }' ${FILE} #awk '/-lprint$/{printf( "%s:%d: %s\n", FILENAME, NR, $0) }' ${FILE} #### replace "-$(RM) $(ULT_BIN)" with "-$(RM) $(ULT_BIN) $(ULT_LIBS)" using awk command. # awk '{sub(/-\$(RM) \$(ULT_BIN)/,"-\$(RM) \$(ULT_BIN) \$(ULT_LIBS)"); print $0}' ${FILE} > ${FILE}.tmp; cp ${FILE}.tmp ${FILE}; rm -rf ${FILE}.tmp #### find "-$(RM) $(ULT_BIN)" by sed command. #sed -n "/\$(CURDIR)\/\%.o: \%.c$/p" ${FILE} #### Ways recommended: Step1. replace "-$(RM) $(ULT_BIN)" with "-$(RM) $(ULT_BIN) $(ULT_LIBS)" using sed command. ## 替换 sed -i 's#\$(CURDIR)\/\%.o: \%.cpp$#\$(CURDIR)\/\%.o: \$(CURDIR)\/\%.cpp#g' ${FILE} ## 替换 sed -i 's#\$(CURDIR)\/\%.o: \%.c$#\$(CURDIR)\/\%.o: \$(CURDIR)\/\%.c#g' ${FILE} ## 替换 sed -i 's#$(bin).o#\$(CURDIR)\/$(bin).o#g' ${FILE} ## 追加(以 $$@ 结尾) sed -i '/ -o \$\$\@$/ a\ @echo \"========================Success========================\"' ${FILE} ## 追加(以 $$@ $$^) 结尾) sed -i '/\$\$\@ \$\$\^)$/ a\ @echo \"========================Success========================\"' ${FILE} done exit 0

@

^) 结尾) sed -i '/\

3 脚本测试

BZ在C/C++工程在/home/vfhky/src,执行这个脚本得到的如下图所示的结果:

使用sed和awk查找和替换字符串处理Makefile文件(三)
使用sed和awk查找和替换字符串处理Makefile文件(三)
4 Linux find 命令中正则

find命令的某个参数使用正则,那么最好对这个对数加上双引号,正如上面的代码"${SEARCH_NAME}"所示,否则会出现下面的错误:

代码语言:javascript
复制
find: paths must precede expression: Makefile1
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
5 脚本管理

目前已经把这个脚本放在Github了,地址是https://github.com/vfhky/shell-tools,以后脚本的更新或者更多好用的脚本也都会加入到这个工程中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 具体功能需求
  • 2 shell程序
  • 3 脚本测试
  • 4 Linux find 命令中正则
  • 5 脚本管理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档