原帖由 dbcat 于 2006-1-11 19:57 发表
TO 大蚂蚁:
我试过了啊...可是不行.
TO 烈火:
呵呵,用AWK是可以的啦 ....不过我想用SED来办
用shell来解决,如何?
引用:
/home/lee#cat file
1 2 3 4 5 6 7 8 9 0
A B C D E F G H I J
2 3 4 5 6 7 8 9 0 1
B C D E F G H I J K
3 4 5 6 7 8 9 0 1 2
C D E F G H I J K L
/home/lee#cat _test
#!/bin/ksh
#假定固定文件是10个域
n=1
while read line;do
set -A array$n $line
((n++))
done<file
varlist=$(
for j in $(typeset);do
[[ $j == array[0-9] ]] && echo \${$j[\$m]}
done
)
m=0
while((m<=10));do
eval echo $varlist
((m++))
done
result引用:
/home/lee#_test
1 A 2 B 3 C
2 B 3 C 4 D
3 C 4 D 5 E
4 D 5 E 6 F
5 E 6 F 7 G
6 F 7 G 8 H
7 G 8 H 9 I
8 H 9 I 0 J
9 I 0 J 1 K
0 J 1 K 2 L
faintblue 回复于:2006-01-12 08:07:26
# cat 1
1 2 3 4 5 6 7 8 9
A B C D E F G H I
1 2 3 4 5 6 7 8 9
a b c d e f g h i
1 2 3 4 5 6 7 8 9
A B C D E F G H I
# cat a
:a
H;ta
$ {
x
s/\n/ @/g
s/$/ /
s/ //
x
:b
g
s/ [^@]*$//
s/ [^@]*@/ /g
s/@//
p
g
s/@../@/g
h
/@@/!tb
}
# sed -n -f a 1
1 A 1 a 1 A
2 B 2 b 2 B
3 C 3 c 3 C
4 D 4 d 4 D
5 E 5 e 5 E
6 F 6 f 6 F
7 G 7 g 7 G
8 H 8 h 8 H
9 I 9 i 9 I
waker 回复于:2006-01-12 09:12:22
与tainblue思路基本一样,不过是一个个字符为单位的
[waker@proxy d1]$ cat file
123456
abc
ABCDE
hijk
lmnopqrstuvw
[waker@proxy d1]$ sed -n 'H;${:a;
g;
s/\n[^\n]/\n/g;
:b;
/[^\n]/s/\n\n/\n \n/g;tb;
x;
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta}' file
结果
1aAhl
2bBim
3cCjn
4 Dko
5 E p
6 q
r
s
t
u
v
w
当然部分不支持\n的用户不能通过
waker 回复于:2006-01-12 09:22:28
改的好读一点儿吧
H #保存所有行
${ #最后一行处理,与AWK的END相似
:a
g #取得保留空间内容
s/\n[^\n]/\n/g #把第一个不是换行符删除
:b #与下面一句形成循环
/[^\n]/s/\n\n/\n \n/g;tb #其实是补位用的
x #交换保留/模式空间内容,这时保留空间已经没有每"行"的第一个字符了
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta #打印出模式空间的所有"行"的第一个字符,再去:a处处理保留空间的内容
}
faintblue 回复于:2006-01-12 11:12:52
引用:原帖由 waker 于 2006-1-12 09:12 发表
... 当然部分不支持\n的用户不能通过 ...
Yes, many sed versions don't support \n as a replacement.
r2007 回复于:2006-01-12 11:41:11
空行没有考虑吧?
1234567
drmfslx
r2007 回复于:2006-01-12 12:02:36
引用:原帖由 faintblue 于 2006-1-12 11:12 发表
Yes, many sed versions don't support \n as a replacement.
这样是否移植性更好?
sed -n 'H;${:a;
g;
s/\(\n\)[^\n]/\1/g;
:b;
/[^\n]/s/\(\n\)\1/\1 \1/g;tb;
x;
s/\n\+\([^\n]\)[^\n]*/\1/gp;ta}'
r2007 回复于:2006-01-12 12:09:19
加了一行就出问题了
cat file
123456
abc
ABCDE
hijk
lmnopqrstuvw
^_^
结果
1aAhl^
2bBim_
3cCjn^
4 Dko
5 E p
6 q
r
s
t
u
v
w
waker 回复于:2006-01-12 12:26:08
空行好解决
最前面加
/^$/s// /
多换行的问题还得考虑
faintblue 回复于:2006-01-12 12:35:48
引用:原帖由 r2007 于 2006-1-12 12:02 发表
这样是否移植性更好?
s/\n\[color=Red]+[/color]\([^\n]\)[^\n]*/\1/gp;ta}'
+ is bad for 移植性.
waker 回复于:2006-01-12 13:01:56
再修订一次吧,虽然不能满足所有sed版本
不过感觉还有修改空间
sed -n '/^$/s// /
H
${
:a
g
s/\(\n\)[^\n]/\1/g
:b
/[^\n]/s/\(\n\)\1/\1 \1/g
tb
x;
s/\n\n*\([^\n]\)[^\n]*/\1/g
s/\n//g
/[^\n]/{p;ba}
}' file
dbcat 回复于:2006-01-12 17:12:23
感谢蚂蚁,烈火,FAINTBLUE , WAKER ,R2007 的无私帮助!
问题圆满解决!
向你们致敬!
[ 本帖最后由 dbcat 于 2006-1-12 17:13 编辑 ]
大蚂蚁 回复于:2006-01-12 18:14:39
呵呵,我是来学习的,建议美女把帖子改个名字,以后方便查阅
macrodba 回复于:2006-01-25 16:53:21
学习ing
pqxpqx 回复于:2006-12-11 17:03:57
学习!
letwave 回复于:2006-12-11 23:39:57
LZ mm is a SiChuan girl.
awk就是awp加ak 回复于:2006-12-12 09:06:17
引用:原帖由 letwave 于 2006-12-11 23:39 发表
LZ mm is a SiChuan girl.
错~
li.he 回复于:2006-12-12 15:39:36
都是武林高手
awk就是awp加ak 回复于:2006-12-14 09:25:49
其中假设行最大长度 255,文本没有分隔符 #, %
sed -n '
1 {
x
:init
s-^.\{0,255\}$-#&-
t init
x
}
H
g
s-\n--
:loop
s-#\([^#]*\)\(.*#\)\([^#]\)\([^#]*\)$-%\1\3 \2\4-
t loop
s-%-#-g
$!h
${
s-^#*--
s-#*$--
p
}
' urfile |tr '#' '\n'
人面不知何处去~ :mrgreen: