《懒人Shell脚本》之一——遍历文件并格式化输出文件

简介: 遍历文件并格式化输出文件

背景

1、项目开发中,急需要根据资源路径res下的文件,生成如下三种格式的文件。

格式一:

#define IDR_CEF_0001    101
#define IDR_CEF_0002    102
...
#define     IDR_CEF_0122    222

格式二:

{“about.html”, IDR_CEF_0001}, 
{“addProbe.html”, IDR_CEF_0002}, 
… 
{“img/helpimg/help17.PNG”, IDR_CEF_0122},

格式三:

IDR_CEF_0001 HTML “res\about.html” 
IDR_CEF_0002 HTML “res\addProbe.html” 
IDR_CEF_0122 HTML “res\img\helpimg\help17.PNG”

【着急情况半手工实现如下】

1.C++实现获取文件名称,输出到txt文档中,拷贝到Excel以便按列处理。

2.构造格式一左数据,组合成格式一数据。

3.结合notepad++正则表达式匹配,构造格式二、三内容,组合成格式二、三数据。

缺点非常明显:

1.手动,很容易路径弄错,文件少弄,后期Bug不可评估。

2.耗时也接近3个小时。

3.如果又有新的文件如(Inner,outer,other)三份资源文件,需要操作3次。
总之,很傻,很笨。

【Shell脚本实现】
源码如下:

#! /bin/bash

function read_dir()
{
for file in `ls $1`
do
if [ -d $1"/"$file ]; then
read_dir $1"/"$file
else
echo $1"/"$file
fi
done
}

#output files
touch out_files.txt
read_dir "/home/laoyang/test/res" > out_files.txt

#recurse files 
#1.delete the front path /home/laoyang
cat out_files.txt | sed 's/\/home\/laoyang\///g' > out22_files.txt

#get line nums
linenums=`cat out22_files.txt | wc -l`
echo $linenums

#construct format_files.txt
#1.#define IDR_CEF_0001 101
rm -rf format_file1.txt
for((i=1;i<=$linenums;i++)) 
do 
echo "#define   IDR_CEF_"${i}    $[ 100 + ${i} ] >> format_file1.txt
done

#2. {"about.html",  IDR_CEF_0001},
cat out22_files.txt | sed 's/test\/res\///g' > out33_files.txt
awk '{print $2}' format_file1.txt > format_file2_1.txt #IDR_CEF_0001 format
sed 's/$/},/g' format_file2_1.txt > format_file2_2.txt 
sed 's/^/{"/g' out33_files.txt > out4_file.txt
sed 's/$/",/g' out4_file.txt > out5_file.txt

paste -d "  " out5_file.txt format_file2_2.txt > format_file2.txt

#3.IDR_CEF_0001 HTML    "res\\about.html"
rm -rf format_file3_2.txt
for((i=1;i<=$linenums;i++)) 
do 
echo "HTML" >> format_file3_2.txt
done

cat out22_files.txt | sed 's/test\///g' > out44_files.txt
cat out44_files.txt | sed 's#\/#\\\\#g' > out55_files.txt   

cat out55_files.txt | sed 's#^#"#g' > out66_files.txt
cat out66_files.txt | sed 's#$#"#g' > out77_files.txt

paste -d "  " format_file2_1.txt format_file3_2.txt > format_file3_tmp.txt
paste -d "  " format_file3_tmp.txt out77_files.txt > format_file3.txt

mkdir format_rst
mv format_file1.txt format_file2.txt format_file3.txt ./format_rst/

优点:

1.快,不会丢失,有多少文件就是多少文件。
2.可以复用,新增文件或者其他模块也有类似文件,直接跑一遍脚本即可。

Shell脚本在文本逐行读取、按列匹配、正则匹配有先天的优势。所以Shell实现是很好的选择。
如果用C++实现代码行数会几百甚至上千,且匹配会非常复杂。


作者:铭毅天下
转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/49834859

相关文章
|
23天前
|
弹性计算 Shell Perl
ecs服务器shell常用脚本练习(二)
【4月更文挑战第1天】shell代码训练(二)
106 1
|
25天前
|
Java Shell
SpringBoot启动脚本Shell
SpringBoot启动脚本Shell
17 0
|
1月前
|
Shell Linux API
【Shell 命令集合 备份压缩 】Linux 解压缩文件 unzip命令 使用指南
【Shell 命令集合 备份压缩 】Linux 解压缩文件 unzip命令 使用指南
53 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】Linux 创建Kickstart文件mkkickstart命令 使用指南
【Shell 命令集合 系统设置 】Linux 创建Kickstart文件mkkickstart命令 使用指南
31 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 备份压缩 】Linux 解码uuencode编码的文件 uudecode 命令 使用指南
【Shell 命令集合 备份压缩 】Linux 解码uuencode编码的文件 uudecode 命令 使用指南
31 0
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
【Shell 命令集合 系统管理 】Linux 自动轮转(log rotation)日志文件 logrotate命令 使用指南
49 0
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
27 3
|
1天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
7 1
|
6天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
26 0
|
7天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句