LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1183|回复: 11

关于sed的问题,请指教。谢谢!

[复制链接]
发表于 2009-3-10 10:04:49 | 显示全部楼层 |阅读模式
#fdisk  -l /dev/hda输出如下:
Disk /dev/hda: 82.3 GB, 82348277760 bytes
255 heads, 63 sectors/track, 10011 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
#fdisk -l /dev/hda | awk '{if($0~/.*cylinders$/) print $0}' | sed 's@.* \([0-9]*\) cylinders$@\1@'
对sed以前的命令可以看懂,但是在sed中出现的@不知道是什么意思,请高手指点。
最后的输出是:10011
发表于 2009-3-10 10:19:11 | 显示全部楼层
  1. sed 's/.* \([0-9]*\) cylinders$/\1/'
复制代码
看得懂了不?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-10 10:49:01 | 显示全部楼层
sed 's/.* \([0-9]*\) cylinders$/\1/',就这一段没有看懂,烦请解释一下。
回复 支持 反对

使用道具 举报

发表于 2009-3-10 11:43:16 | 显示全部楼层
@ 是用來區分的符號, 跟 / 一樣

sed 's/.* \([0-9]*\) cylinders$/\1/'
是說把 零或多個任何字符 跟著 零或多個數字 跟著 結尾是cylinders 替換成
被\(  \) 中的 類容
中文沒學好, 希望你能看明白
回复 支持 反对

使用道具 举报

发表于 2009-3-10 12:08:22 | 显示全部楼层
\1
是什么意思?
回复 支持 反对

使用道具 举报

发表于 2009-3-10 13:29:28 | 显示全部楼层
RE 的 \( \) 中的 pattern 會被摘取, 以后 可以用 '\n' 來調用
這里的 \1 就是說 的一個摘取的
回复 支持 反对

使用道具 举报

发表于 2009-3-12 12:54:46 | 显示全部楼层
还是不懂 \1的意思  在sed手册没有找到
把.* \([0-9]*\) cylinders$替换为\1吗  
新手啊,希望有前辈详细解释下啊
回复 支持 反对

使用道具 举报

发表于 2009-3-12 13:35:45 | 显示全部楼层
這是 regular expression
\( \) 中的是 subexpression 會被摘取, 然后可以調用
試試這個

  1. echo 'abc123DEF!@#' |
  2. sed 's/\([a-z]*\)\([0-9]*\)\([A-Z]*\)\([:punct:]*\)/\4 \3 \2 \1/'
复制代码


\1 是abc   \2是123   \3是DEF   \4是!@#

那么原題就好理解了
.* \([0-9]*\) cylinders$ 找到的是這一行
255 heads, 63 sectors/track, 10011 cylinders

其中跟 \([0-9]*\) 符合的 10011 被摘取, 然后可以用 \1 調用
那么
sed 's@.* \([0-9]*\) cylinders$@\1@' == sed 's/.* \([0-9]*\) cylinders$/10011/'
回复 支持 反对

使用道具 举报

发表于 2009-3-12 14:29:30 | 显示全部楼层
茶哥~~你是我的偶像!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-3-14 21:09:37 | 显示全部楼层
现在在学习shell编程,感觉正则表达式这块比较难,茶兄有没有这方面比较系统的资料或建议 。谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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