Linux 批量替换文件内容
目录
正题,替换不可见字符 <0x00>, vim 打开可能会显示 ^@
场景前提
由于编辑器批量操作或者其他误操作,且没有线上代码仓库,或者无法通过代码仓库回滚(原因是本地修改了大量的代码)而导致要批量修改文件内容要怎么办。目前的情况就是公司防御没有做好,导致未提交的代码被加密了,虽然最后抢救回来,但是解密后的文件被大量添加了 不可见的字符串 <0x00> 熟悉Linux的都知道遇到这个就会停止读取了。而且在编辑器看起来非常难看,sublime有批量文件夹替换,但是量太多太卡了,不理想。最后决定用Linux下shell命令行来搞
Linux find 命令
find [路径] [参数]
find ./ -type f
其他参数就不解释了,上面的意思就是查找当前目录下所有所有普通文件 ,当然你也可以指定特定的一个文件
Linux sed命令
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,删除匹配的字符串,所以 d 后面通常不接任何东西;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
正则实例
sed -i "s/search/replace/g" ./test.txt
解释:
在test.txt文件中全局正则匹配到 search【改成你需要的】字符串 并替换为 replace 【改成你需要的】字符串,格式就是 s/匹配字符串/替换的字符串/g
正题,替换不可见字符 <0x00>, vim 打开可能会显示 ^@
sed -i "s/\x00//g" `find ./ -type f;`
最终替换命令组合为上面所示。意思是全局替换当前目下所有普通文件中包含不可见字符 <0x00> 为空字符,也就是去掉 <0x00>
注意事项
sed -i 参数代表直接修改原文件,请测试好之后再运行命令,并且做好备份
如果只是一小部分文件含有,或者要替换含有特定内容的文件,请用grep命令来过滤文件而不是find全部列举,使不必要文件进行sed操作