这些我怎么看不懂?帮忙解释一下,谢谢!

本帖最后由 gogo11 于 2011-6-14 15:12 编辑

1、sed '1,/start/ s/#.*//' <old >new 这里边的#.*是什么意思?是不是通配符?<old可以写成old,不用定向符号?
2、
1.5 替换和插入换行符号
  替换 (echo a;echo x;echo y) | sed '/x$/ {
       N
       s:x\n:x:
       }'

  插入
       (echo a;echo x;echo y) | sed 's:x:X\
       :'
这个看不懂在用什么替换什么……

3、解释一下sed -n '/^.\{87\}$/p' zz.log,上边说是找出每行有87个字符的,我又看不懂了,神啊!救救我吧!

俺准备把sed和awk粗略的看一下,学习建立smb服务器,sed和awk也博大精深,两个命令都出了本书,靠!

作者: gogo11   发布时间: 2011-06-14

本帖最后由 age 于 2011-6-14 15:30 编辑
1、sed '1,/start/ s/#.*//' new 这里边的#.*是什么意思?是不是通配符?
gogo11 发表于 2011-6-14 15:05
这全是正则表达式的写法
1. 这个应该是删除注释的
#是普通字符, 也就是注释行的开始, "."代表任意一个字符, "*"表示重复前面的字符0~n次. 组合起来就是, 在#后的所有字符
s///g这是sed的替换语法, 前一个//里写判断条件, 后一个//里写替换内容. 此处为空, 所以相当于删除匹配字段
2. 这个有点奇怪, :一般是当标签用, 这里是代替/, 可以替换成/, 这样比较好解释点
  1.   替换 (echo a;echo x;echo y) | sed '/x$/ {
  2.        N
  3.        s/x\n/x/
  4.        }'
复制代码
N表示读入下一行, 此时可以读取换行符\n
把x\n换成x, 这样就少了一个换行符, 从而x y将在同一行显示.
这是输出
  1. [allblue@MyLady b]$ (echo a;echo x;echo y) | sed '/x$/ {
  2.        N
  3.        s/x\n/x/
  4.        }'
  5. a
  6. xy
复制代码
类似的,        (
  1. echo a;echo x;echo y) | sed 's/x/X\
  2.        :'
复制代码
这里的\类似换行符, 可以换成\n, 提供换行效果, 同时把x替换为X, 这样在X后就有二个换行符, 从而产生一个空行,
输出为
  1. [allblue@MyLady b]$        (echo a;echo x;echo y) | sed 's/x/X\
  2.        /'
  3. a
  4. X
  5.       
  6. y
复制代码
3. {m,n}表示匹配前面字符多少次, m为最小值, n为最大值, 这里规定了一个范围. 可以只写一个, 那就是给定次数. 因为{}是特殊字符, 所以要用\转义下. 而"."如前所述, 匹配任意一个字符. ^表示行首, $表示行尾. 因此^.\{87\}$匹配整句只有87个字符的语句.

作者: age   发布时间: 2011-06-14

sed '/^$/ p' <old 只对空行输出两次 , 其他只输出一次
我记着好像行末尾标志是“\n”,这儿怎么是“$”
正则表达式也博大精深阿!

作者: gogo11   发布时间: 2011-06-14

本帖最后由 age 于 2011-6-14 15:31 编辑
sed '/^$/ p'
gogo11 发表于 2011-6-14 15:25
\n是换行
$是行尾
二者不一样的
因为正则表过式一般是以行为单位处理的, 所以很少用到\n, 都是$
多行匹配时才需要用到\n

作者: age   发布时间: 2011-06-14

gogo11@localhost:~/test$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2011-06-03 20:15 /bin/sh -> dash
gogo11@localhost:~/test$ ls -l /bin/bash
-rwxr-xr-x 1 root root 801808 2010-08-11 03:58 /bin/bash
gogo11@localhost:~/test$
原来sh是dash,一直以为是bash~~~~~~
-----------------------------------------------------------------------------------------
gogo11@localhost:~/test$ sed -n '/-1/{/张/p}' sed.txt | sed 'y/-1/10/'
00000000700        张照健        200502098200060305        10        10        10        省科技馆        土木建筑
00000000720        张琳        200520098702060027        10        10        10        省科技馆        综合管理
00000000808        张婷婷        200002098303022826        10        10        10        省科技馆        综合管理
00000000008        张世源        200282098407022327        10        10        10        省科技馆        综合管理
00000002702        张鹏        200203098208007337        10        10        10        省科技馆        综合管理
00000003320        张晓莉        230002098500022026        10        10        10        省科技咨询中心        科技项目管理
00000003507        张雪松        200782098604224002        10        10        10        省科技咨询中心        科技项目管理
00000004005        张立红        030229098302204825        10        10        10        省科技咨询中心        科技项目管理
00000004004        张宇宏        200303098309052300        10        10        10        省科技咨询中心        科技项目管理
这个命令y在字符串长度一样的情况下好像和s命令一个样,说明y命令是s命令的子命令,这个对吗?
-----------------------------------------------------------------------------------------
3.4 写入文件命令 w filename( 注意与 s 命令的 /w 选项的区别 )
  把某些行写入文件 filename
  sed -n '/^[0-9]*[02468]/ w even' <old    将以偶数开始的行写入文件 even
这个又看不懂了。^表示在开头匹配,*号表示匹配0~n次,[02468]表示匹配02468单个字符,合起来是什么意思?
明天还是看看正则表达式,晕头了~~~~~~~~~~

作者: gogo11   发布时间: 2011-06-14