LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: KornLee

出道题考考你?

[复制链接]
发表于 2003-8-13 02:11:03 | 显示全部楼层
sed -e 's/\([a-z]*$\)/ &/' -e 's/\([^ ]*\) \([a-z]*\)/\2 \1/'

这里有两个转换步骤:
1. 转成中间用空格分隔的形式
本想直接匹配汉字和英文字符,再反转;试了试,不太好使,就曲折了一下。[a-z]*$ 匹配每行最后的所有英文字符,加上了引号表示把它作为一个“引用”来使用,这样,后面就可以用 & 来直接引述它了。
所以,'s/\([a-z]*$\)/ &/' 就是用空格+匹配到的字符来代替原来的“位于每行行尾的所有小写英文字符”。
2. 根据中间的空格做标志,把它前后的字符串位置对调
\([^ ]*\) 是匹配空格前面的所有字符,\([a-z]*\) 则匹配空格后面的小写英文字符。这里都用括号括了起来,这样后面就可以分别用 \1 和 \2 来引用他们的。把它们替换成 \2 \1 的形式自然就是对调了空格前后的字符。
发表于 2003-8-13 09:54:27 | 显示全部楼层
sed  's/[a-z]*$/ &/' test | gawk "{print \$2 \" \" \$1}"
发表于 2003-8-13 17:36:11 | 显示全部楼层
to idkey:
This is what you want:

sed 's/\([^[:alpha:]]*\)\([a-z]*$\)/\2 \1/' test
发表于 2003-8-14 10:42:20 | 显示全部楼层
怪了,试过 :alpha: 之后,又试了试 ^a-z,也挺好使的。但我记得那天试过这条命令呀:
sed 's/\([^a-z]*\)\([a-z]*$\)/\2 \1/'
看来那天肯定什么地方搞错了,闹了个笑话,呵呵
发表于 2003-8-14 12:24:54 | 显示全部楼层
Why $ is necessary? I am wondering.
发表于 2003-8-14 14:19:54 | 显示全部楼层
倒不是必需,而是我一般喜欢把匹配条件指定的比较苛刻,尽量避免条件太宽产生意外匹配--习惯而已。
 楼主| 发表于 2003-8-14 14:41:25 | 显示全部楼层
最初由 idkey 发表
倒不是必需,而是我一般喜欢把匹配条件指定的比较苛刻,尽量避免条件太宽产生意外匹配--习惯而已。

这种严谨的作风值得学习,:thank
发表于 2003-8-14 15:25:18 | 显示全部楼层
最初由 javalee 发表
这种严谨的作风值得学习,:thank

:!! 不用这么拔高吧,吼吼
发表于 2003-8-14 23:13:12 | 显示全部楼层
最初由 idkey 发表
怪了,试过 :alpha: 之后,又试了试 ^a-z,也挺好使的。但我记得那天试过这条命令呀:
sed 's/\([^a-z]*\)\([a-z]*$\)/\2 \1/'
看来那天肯定什么地方搞错了,闹了个笑话,呵呵


我也有过相同经历,好象shell编程偶尔会失灵.
发表于 2003-8-15 00:28:15 | 显示全部楼层

踩一脚:)

benzy@benzy tmp $ cat text
工a
式aa
工aaaa
工期aaad
工艺aaan
benzy@benzy tmp $ sed -e 's/^\([^a-z]*\)\([a-z]*\)$/\2 \1/g' text
a 工
aa 式
aaaa 工
aaad 工期
aaan 工艺
benzy@benzy tmp $
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表