LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: KornLee

出道题考考你?

[复制链接]
发表于 2006-2-12 14:26:09 | 显示全部楼层
[QUOTE=idkey]sed -e 's/\([a-z]*$\)/ &/' -e 's/\([^ ]*\) \([a-z]*\)/\2 \1/'

明白一点了。
但是 s∧是什么意思,还有“s/\([a-z]*$\ ”中用\是否表示转意。能讲一下吗
回复 支持 反对

使用道具 举报

发表于 2006-2-15 09:40:03 | 显示全部楼层
好像扩展正则表达式用括号标签()不行。如下命令:
cat aa.txt|sed -re 's/\([^a-z]+\)/\1 /'
就会报错:
sed:-e 表达式 #1,字符 19:Invalid reference \1 on `s' command's RHS
看它的意思好像是\1标签无效。
但是试下边的命令就可以:
cat aa.txt|sed -e 's/\([^a-z]*\)/\1 /'
我的sed版本是4.0.5
回复 支持 反对

使用道具 举报

发表于 2006-3-23 20:52:40 | 显示全部楼层
Post by idkey
sed -e 's/\([a-z]*$\)/ &/' -e 's/\([^ ]*\) \([a-z]*\)/\2 \1/'

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

------------------------------------------------------------------------------
你的空格怎么加的啊?原文中汉字和字母是没有空格的。
我在linux下试过了,不好使。
sed -ne '/\([^ ]*\)/p' 怎么匹配空格前面的所有字符?

[WIKI-root@share ~]# cat file.txt | sed -e 's/\([a-z]*$\)/ &/' -e 's/\([^ ]*\) \([a-z]*\)/\2 \1/'
工a
式aa
工aaaa
工期aaad
工艺aaan
da89
[WIKI-root@share ~]# cat file.txt
工a
式aa
工aaaa
工期aaad
工艺aaan
da89
[WIKI-root@share ~]#
回复 支持 反对

使用道具 举报

发表于 2006-3-24 13:39:13 | 显示全部楼层
O MY GOD
回复 支持 反对

使用道具 举报

发表于 2006-3-24 16:05:17 | 显示全部楼层
cat file | sed 's/\(^[^a-z]*\)\([a-z]\{1,\}$\)/\2 \1/g'
回复 支持 反对

使用道具 举报

发表于 2009-8-26 10:32:03 | 显示全部楼层
翻倒这个老帖,用awk试试:
cat a | awk '{match($0, /[a-z]/);  print substr($0, RSTART), substr($0, 1, RSTART-1)}'
回复 支持 反对

使用道具 举报

发表于 2009-8-26 15:48:25 | 显示全部楼层
那么多人是UUOC的粉,真是太刺激了...
回复 支持 反对

使用道具 举报

发表于 2009-8-30 00:12:56 | 显示全部楼层
sed 's/\(^[^a]*\)\(a*.*\)/\2 \1/g'
回复 支持 反对

使用道具 举报

发表于 2010-1-31 18:24:47 | 显示全部楼层
sed -r 's/([^a-z]+)(.*)/\2 \1/g'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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