求个脚本:文本处理!

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

求个脚本:文本处理!

#1

帖子 cnkilior » 2008-11-12 16:24

数据文件 写了: ASD01_FGH=1
ASD01_CVB=2
ASD01_ERT=3
ASD02_FGH=1
ASD02_CVB=2
ASD02_ERT=3
ASD03_FGH=1
ASD03_CVB=2
ASD03_ERT=3
ASD04_FGH=1
ASD04_CVB=2
ASD04_ERT=3
改写成:
目标 写了: ASD_FGH[01]=1
ASD_CVB[01]=2
ASD_ERT[01]=3
ASD_FGH[02]=1
ASD_CVB[02]=2
ASD_ERT[02]=3
ASD_FGH[03]=1
ASD_CVB[03]=2
ASD_ERT[03]=3
ASD_FGH[04]=1
ASD_CVB[04]=2
ASD_ERT[04]=3
最好只用sed,最好只用一个sed语句。别用循环!
如果有其他跟好的办法,忽略我的要求。
谢谢啦!
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: 求个脚本:文本处理!

#2

帖子 xiooli » 2008-11-12 16:51

代码: 全选

sed 's/\(0[0-9]\)\(_[A-Z]..\)/\2[\1]/' file

代码: 全选

xiooli(~/桌面)╠☪ cat a
ASD01_FGH=1
ASD01_CVB=2
ASD01_ERT=3
ASD02_FGH=1
ASD02_CVB=2
ASD02_ERT=3
ASD03_FGH=1
ASD03_CVB=2
ASD03_ERT=3
ASD04_FGH=1
ASD04_CVB=2
ASD04_ERT=3
xiooli(~/桌面)╠♦ sed 's/\(0[0-9]\)\(_[A-Z]..\)/\2[\1]/' a
ASD_FGH[01]=1
ASD_CVB[01]=2
ASD_ERT[01]=3
ASD_FGH[02]=1
ASD_CVB[02]=2
ASD_ERT[02]=3
ASD_FGH[03]=1
ASD_CVB[03]=2
ASD_ERT[03]=3
ASD_FGH[04]=1
ASD_CVB[04]=2
ASD_ERT[04]=3
xiooli(~/桌面)╠☪ 
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: 求个脚本:文本处理!

#3

帖子 cnkilior » 2008-11-12 17:05

我猜就有人这样做,怪我例子给简单了。
AS_D01_F_GH=1
AS_D01_CV_B=2
AS_D01_ERT=3
AS_D02_F_GH=1
AS_D02_CV_B=2
AS_D02_ERT=3
AS_D03_F_GH=1
AS_D03_CV_B=2
AS_D03_ERT=3
AS_D04_F_GH=1
AS_D04_CV_B=2
AS_D04_ERT=3
转换成:
AS_D01_F_GH=1
AS_D_CV_B[01]=2
AS_D_ERT[01]=3
AS_D_F_GH[02]=1
AS_D_CV_B[02]=2
AS_D_ERT[02]=3
AS_D_F_GH[03]=1
AS_D_CV_B[03]=2
AS_D_ERT[03]=3
AS_D_F_GH[04]=1
AS_D_CV_B[04]=2
AS_D_ERT[04]=3
不只到04哈,最多到16。我要处理的数据就是这个格式的。基本一模一样。等号右边的不一定都是数字,啥都有。数字右边的字段长度不一,有固定范围!
不过仍要谢谢你,你的给我很大的提示!
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: 求个脚本:文本处理!

#4

帖子 xiooli » 2008-11-12 17:17

sed 's/\([0-9].\)\(.*\)\(=\)/\2\3[\1]=/;s/=//' file
或者更科学点:
sed 's/\([0-9]\{2\}\)\(.*\)\(=\)/\2\3[\1]=/;s/=//' file
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: 求个脚本:文本处理!

#5

帖子 cnkilior » 2008-11-12 17:35

经过你的提示,我也写成了,用了表达式分组。
sed 's/\([0-9][0-9]\)\(_[A-Z]\{1,6\}\(_[A-Z]\{1,5\}\)\{0,1\}\)/\2[\1]/' file

这是适用我的情况的。
上次由 cnkilior 在 2008-11-12 22:30,总共编辑 1 次。
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
送出感谢: 0
接收感谢: 3 次
联系:

Re: 求个脚本:文本处理!

#6

帖子 xiooli » 2008-11-12 17:46

cnkilior 写了:经过你的提示,我也写成了,用了表达式分组。
sed 's/\([0-9][0-9]\)\(_[A-Z]\{1,6\}\(_[A-Z]\{1,5\}\)\{0,1\}\)/\2[\1]/' file

这是使用我的情况的。
好晕 :em06
头像
cnkilior
论坛版主
帖子: 4981
注册时间: 2007-08-05 17:40
送出感谢: 0
接收感谢: 5 次

Re: 求个脚本:文本处理!

#7

帖子 cnkilior » 2008-11-12 22:30

其实可以简单点。
sed 's/\([0-9][0-9]\)\(\(_[A-Z]\{1,6\}\)\{1,2\}\)/\2[\1]/' file

-------
\(_[A-Z]\{1,6\}\)是一个表达式分组,他匹配1-2次,
外面的是(不知道用什么东西说),也就是\2。

---------
我最初忘记了可以用正则表达式分组。

-------------
另外AS_D_ERT[04],以0开头的数组下标,bash理解为8进制下标,也就是AS_D_ERT[08]是非法的。
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星
送出感谢: 1 次
接收感谢: 0

Re: 求个脚本:文本处理!

#8

帖子 xhy » 2008-11-13 1:34

代码: 全选

sed  's/\([0-9]\+\)\([^=]*\)/\2[\1]/' file
目前负债150多万
回复

回到 “Shell脚本”