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命令,自行百度(参考)