sed处理文件-在指定关键字的行首 增加/删除.c文件的“//“(删除依赖增加)

Win下执行shell脚本,可以安装一个git

删除之前要先做增加操作,原因:增加时会临时生成.line文件用于记录修改的行,删除操作则只恢复本次修改的行

附:测试脚本包,执行Noteadd.sh后,生成.line文件,对比.c与.bak文件即能观察出修改结果,再执行Notedel.sh则恢复.c文件同时删除.line临时文件

附件地址

增加"//"

脚本:

#/bin/bash

SIG1=MLSWriteLog
SIG2=MLDumpBuf

#find -type f -name "*.c*" | xargs sed -i -e '/\<'$SIG1'\>.*;$/s/^/\/\//' -e '/\<'$SIG2'\>.*;$/s/^/\/\//' 

#打印c/cpp文件里有MLSWriteLog且不是以;结尾的下一行
#find -type f -name "*.c*" | xargs sed -n -e '/\<MLSWriteLog\>.*[,|"]$/{n;p}'
#打印c/cpp文件里有MLSWriteLog且以,|"结尾的下一行中以;结尾的行
#find -type f -name "*.c*" | xargs sed -n -e '/\<MLSWriteLog\>.*[,|"]$/{n;p}' | sed -n -e '/;$/{p}'

ALLFILE=`find -type f -name "*.c" | wc -w`
FINISHED=0
for FileName in `find -type f -name "*.c"`
do
    echo FileName: $FileName > $FileName.line
    sed -n -e '/\<'$SIG1'\>.*;$/{=}' -e '/\<'$SIG2'\>.*;$/{=}' $FileName >> $FileName.line
    sed -i -e '/\<'$SIG1'\>.*;$/{s/^/\/\//}' -e '/\<'$SIG2'\>.*;$/{s/^/\/\//}' $FileName
    for LineNum1 in `sed -n -e '/\<'$SIG1'\>.*[,|"]$/{=}' $FileName`
    do
        echo $LineNum1 >> $FileName.line
        LineNum2=`expr $LineNum1 + 1`
        sed -i -e ''$LineNum1'{s/^/\/\//}' $FileName
        if [ `sed -n -e ''$LineNum2'p' $FileName | sed -n '/;$/p' | wc -w` -ne 0 ]
        then
            echo $LineNum2 >> $FileName.line
            sed -i -e ''$LineNum2'{s/^/\/\//}' $FileName
        else
            echo $LineNum2 >> $FileName.line
            LineNum3=`expr $LineNum2 + 1`
            sed -i -e ''$LineNum2'{s/^/\/\//}' $FileName
            if [ `sed -n -e ''$LineNum3'p' $FileName | sed -n '/;$/p' | wc -w` -ne 0 ]
            then
                echo $LineNum3 >> $FileName.line
                sed -i -e ''$LineNum3'{s/^/\/\//}' $FileName
            else
                echo faile in $FileName $LineNum3 >> $FileName.line
            fi
        fi
    done
    FINISHED=`expr $FINISHED + 1`
    echo End of processing $FileName >> $FileName.line
    echo End of processing $FileName finished $FINISHED\/$ALLFILE
done

说明

  • 可以单独设置SIG1/SIG2,替换关键字,for循环是用于解决C语言中一句代码不全在一行的情况,SIG1/2需要分两次做,只需要再复制一遍SIG1就OK

  • 每处理一个.c文件都会生成一个同名的.line文件

命令的解释

主要难点是sed命令,可以百度查一下,我也是参考介绍一点点摸索写的(参考)

删除"//"

脚本:

#/bin/bash
ALLFILE=`find -type f -name "*.line" | wc -w`
FINISHED=0
for FileName in `find -type f -name "*.line"`
do
    FileCName=`sed -n -e '1p' $FileName | awk -F: '{print $2}'`
    #echo FileCName is $FileCName
    
    EndLine=`sed -n '/End/{=}' $FileName`
    EndLine=`expr $EndLine - 1`
    
    for LineNum in `sed -n '2,'$EndLine'p' $FileName`
    do
        #echo LineNum is $LineNum
        sed -i ''$LineNum's/^\/\///' $FileCName
    done
    rm $FileName
    FINISHED=`expr $FINISHED + 1`
    echo End of processing $FileCName finished $FINISHED\/$ALLFILE
done

说明

  • 使用前要执行Noteadd.sh脚本

  • 该脚本全依赖.line脚本中读取到的行号,行号在写入时是每行存一个行号

  • 该脚本依赖生成.line时所有行号打印完毕后,最后一句的关键字End,保证了有效行号的范围

解释

主要难点是awk命令,自行百度(参考)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值