sh/bash/dash/ksh/zsh等Shell脚本
-
cnkilior
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#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
- 来自: 成都
-
联系:
#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
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#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
- 来自: 成都
-
联系:
#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
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#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
- 来自: 成都
-
联系:
#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
这是使用我的情况的。
好晕
-
cnkilior
- 论坛版主
- 帖子: 4984
- 注册时间: 2007-08-05 17:40
#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
- 来自: 火星
#8
帖子
由 xhy » 2008-11-13 1:34
代码: 全选
sed 's/\([0-9]\+\)\([^=]*\)/\2[\1]/' file
目前负债150多万