免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3047 | 回复: 13
打印 上一主题 下一主题

[文本处理] 如何将文件中特定字符之间的内容提取出来进行处理在放原地方 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-02-21 14:10 |只看该作者 |倒序浏览
一堆.c 文件中,需要将文件中#include "xxxx.h" 中的xxx.h 提取出来,进行处理,然后在放回原地方去

举例 a.c

cat  a.c

#include "AI_LED.h"
#include    "bt_led_show.h"
#include "Log_A.h"

...
...

最终要实现的是
1. 所有xxx.h 都修改为小写
2. 如果有 AI_ 出现的, 将AI_ 修改为 kal_new_     =========>例如第一行 #include "kal_new_led.h"
3. 没有 AI_ 出现的,在前面追加  kal_new_           =========>例如第二行 #include " kal_new_bt_led_show.h"

最终希望如下:
cat  a.c

#include "kal_new_led.h"
#include " kal_new_bt_led_show.h"
#include "kal_new_log_a.h"
...



我只实现了遍历 取出 xxx.h  但是如何替换到原位置就搞不清楚
change_inlcude_name () {
#找出目录下的c 文件
for cfile in $( ls -a $1 | grep '.c' )
do
  echo $1/`basename $cfile`
  #找出该.c文件下#include "xxx.h"  中的 xxx.h
  for includename in $( grep "#include" $1/`basename $cfile` | sed -r 's/.*\"(.*)\"/\1/p' )
  do
   #将所有xxx.h 修改为小写
   INCLUDE_FILE_NAME="$(echo `basename $includename` | tr '[:upper:]' '[:lower:]' )"
   
  done  
done
}


论坛徽章:
0
2 [报告]
发表于 2019-02-21 15:25 |只看该作者

$ cat a.c
#include "AI_LED.h"
#include    "bt_led_show.h"
#include "Log_A.h"


$ sed -r 's/(#include +)"(.+)"/\1"\L\2"/' a.c | sed -r 's/(#include +")ai_(.*")/\1kal_new_\2/;t; s/(#include +")(.*")/\1kal_new_\2/'

#include "kal_new_led.h"
#include    "kal_new_bt_led_show.h"
#include "kal_new_log_a.h"

论坛徽章:
0
3 [报告]
发表于 2019-02-21 15:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2019-02-21 15:51 |只看该作者
回复 3# 本友会机友会摄友会

谢谢你! 厉害,我的神!!!有空试试powershell !

论坛徽章:
0
5 [报告]
发表于 2019-02-21 16:25 |只看该作者
回复 2# csccyab

你好!! 谢谢你的指导 !!!

但是 感觉好卡啊~~~


这些文件是放在 A目录下。

A====>总目录
   B===>子目录
       B.c
       B.h
   C===>子目录
       C.c
       C.h
       C1.c
       C2.c
        ....
...

我写了个遍历的脚本  changefile.sh

#!/bin/bash

change_inlcude_name () {
#找出目录下的c 文件
for xfile in $( ls -a $1 | grep '.c\|.h' )
do
      sed -r -i 's/(#include +)"(.+)"/\1"\L\2"/' $1/`basename $xfile ` | sed -r -i 's/(#include +")ai_(.*")/\1kal_new_\2/;t; s/(#include +")(.*")/\1kal_new\2/' $1/`basename $xfile `
done
}


for module_folder in $(ls -l $1 | awk '/^d/ {print $NF}')
do
    change_inlcude_name $1/`basename $module_folder`
done


然后执行
./changefile  A

确实可以,但是非常卡!!!不知道是不是我电脑配置不好!

论坛徽章:
0
6 [报告]
发表于 2019-02-21 16:26 |只看该作者
本帖最后由 mksu 于 2019-02-21 16:34 编辑

而且 多运行一次, kal_new_  就多添加一次

论坛徽章:
0
7 [报告]
发表于 2019-02-21 16:26 |只看该作者
回复 2# csccyab

你好!! 谢谢你的指导 !!!

但是 感觉好卡啊~~~


这些文件是放在 A目录下。

A====>总目录
   B===>子目录
       B.c
       B.h
   C===>子目录
       C.c
       C.h
       C1.c
       C2.c
        ....
...

我写了个遍历的脚本  changefile.sh

#!/bin/bash

change_inlcude_name () {
#找出目录下的c 文件
for xfile in $( ls -a $1 | grep '.c\|.h' )
do
      sed -r -i 's/(#include +)"(.+)"/\1"\L\2"/' $1/`basename $xfile ` | sed -r -i 's/(#include +")ai_(.*")/\1kal_new_\2/;t; s/(#include +")(.*")/\1kal_new\2/' $1/`basename $xfile `
done
}


for module_folder in $(ls -l $1 | awk '/^d/ {print $NF}')
do
    change_inlcude_name $1/`basename $module_folder`
done


然后执行
./changefile  A

确实可以,但是非常卡!!!不知道是不是我电脑配置不好!


./changefile
然后

论坛徽章:
0
8 [报告]
发表于 2019-02-21 16:26 |只看该作者
回复 2# csccyab

你好!! 谢谢你的指导 !!!

但是 感觉好卡啊~~~


这些文件是放在 A目录下。

A====>总目录
   B===>子目录
       B.c
       B.h
   C===>子目录
       C.c
       C.h
       C1.c
       C2.c
        ....
...

我写了个遍历的脚本  changefile.sh

#!/bin/bash

change_inlcude_name () {
#找出目录下的c 文件
for xfile in $( ls -a $1 | grep '.c\|.h' )
do
      sed -r -i 's/(#include +)"(.+)"/\1"\L\2"/' $1/`basename $xfile ` | sed -r -i 's/(#include +")ai_(.*")/\1kal_new_\2/;t; s/(#include +")(.*")/\1kal_new\2/' $1/`basename $xfile `
done
}


for module_folder in $(ls -l $1 | awk '/^d/ {print $NF}')
do
    change_inlcude_name $1/`basename $module_folder`
done


然后执行
./changefile  A

确实可以,但是非常卡!!!不知道是不是我电脑配置不好!

论坛徽章:
0
9 [报告]
发表于 2019-02-22 11:44 |只看该作者
本帖最后由 csccyab 于 2019-02-22 11:54 编辑

用 find 試試 (即時修改, 慎用)

find A -type f \( -name "*.c" -o -name "*.h" \) -print0 | xargs -0 sed -i -r 's/(#include +)"(.+)"/\1"\L\2"/'

find A -type f \( -name "*.c" -o -name "*.h" \) -print0 | xargs -0 sed -i -r 's/(#include +")ai_(.*")/\1kal_new_\2/;t; s/(#include +")(.*")/\1kal_new_\2/'

论坛徽章:
0
10 [报告]
发表于 2019-02-22 11:47 |只看该作者
本帖最后由 csccyab 于 2019-02-22 11:50 编辑
mksu 发表于 2019-02-21 16:26
而且 多运行一次, kal_new_  就多添加一次

你看清楚你的要求


1. 所有xxx.h 都修改为小写

2. 如果有 AI_ 出现的, 将AI_ 修改为 kal_new_     =========>例如第一行 #include "kal_new_led.h"
3. 没有 AI_ 出现的,在前面追加  kal_new_           =========>例如第二行 #include " kal_new_bt_led_show.h"

第一次运行, AI_ 己换成 kal_new,  第二次己經沒有 AI_
多运行一次, 就肯定添加一次了

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP