中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 如何显示文件的最后一行? 上一主题 | 下一主题
fan927
初级用户





积分 82
发帖 31
注册 2006-5-23
状态 离线
『第 16 楼』:  

说的也是,请教一下,这个*是什么作用吗?多谢Climbing兄.

2006-5-26 06:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 17 楼』:  

在正则表达式中,*表示前面字符从0个到若干个的重复,注意*前面还有一个空格。当然,严格追究,如果最后一行不是若干个ASCII的空格,而是汉字的全角空格或者是制表字符等,恐怕我那个命令也会失效,所以这就要具体情况具体分析了,必要时可以使用正则表达式中的字符集[xyz]来定义要过滤的字符。
sed "/^[ \t]*$" | ...

当然,我不知道上述写法是否正确,对于sed及正则表达式的了解我也只是一知半解。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-26 10:40
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 18 楼』:  

To  Climbing
sed 可以用这样的方法过滤掉空行及空白行,而只显示含有有效字符的最后行。
sed -n "/^[ \t]*$/!h;${g;p}" file



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-5-26 23:34
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 19 楼』:  

Re 无奈何:

请教一下“${g;p}”表示什么操作?



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-27 17:24
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 20 楼』:  

Re Climbing
这个例子中用到的函数解释如下:
        h 用模式空间的内容替换保留空间的内容。
        g 用保留空间的内容替换模式空间的内容。
        p 将模式空间写到标准输出。
前半部分代码的意思是,当当前行不匹配正则时就执行 h 命令,既保存当前行到保留空间。
${g;p} 的作用是当到达文件末尾时,替换模式空间的内容为此前保存到保留空间的内容,并输出。



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-5-27 19:54
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 21 楼』:  

Re 无奈何:

学习了好长时间的sed的帮助,但一直还是搞不太明白sed的高级用法,例如楼上所说
的什么模式空间、保留空间等这些内容。看了你的解释,我更晕了。能不能系统的讲一下有关的概念?最好结合一些例子,看英文的说明,好多不知道什么意思。

有时候,我们经常用正则表达式来寻找一个有特定规律的字符串,然后将这个字符串替换为另一个(但替换后的内容包括查找的内容),例如查找由一串a组成的字符串(a的数量不定),假设找到后替换为原字符串加上一个数字5。我一直不知道如何用sed进行这样的操作。实际上这个问题就是后面的替换操作如何引用前面找到的字符串的问题。

例如:
查找:aaa      找到后替换为:aaa5
查找:aaaa     找到后替换为:aaaa5

希望无奈何兄在这方面再详细讲一下,谢谢!



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-27 23:14
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 22 楼』:  

Re Climbing
        说实在的我对 sed 的高级用法只是有所了解,根本不能自由运用。特别是 sed 模式空间(pattern space)、存储(或保留)空间(hold space)太过于抽象,同时还必须了解 sed 的处理机制和每个函数的执行流程。网上有很好的教程,你可以一点点学习,好多文章我读过 n+1 遍后仍不能很好掌握。
        关于字符串的匹配及获取,你需要了解正则表达式的应用。关于正则表达式的内容有些庞杂, unix 正则表达式有基本元字符集、扩展元字符集;还有大多数脚本语言使用的 perl 正则表达式。开始学习的时候有些困难,多看多用慢慢就会掌握的。简单的应用并不困难,当能自由运用时会发现手中的工具强大许多。
        你的问题实例
echo aaa |sed "s/\(a\{3\}\)/\15/"
echo aaa |sed -r "s/(a{3})/\15/"
可以看到 sed 在元字符集和扩展元字符集模式下不一样,给你提供一些网络链接,希望你早日掌握,有问题可以一起讨论。


正则表达式之道:http://dev.csdn.net/article/44/44550.shtm
正規表示式的入門與應用:http://www.rtfiber.com.tw/~changyj/
SED 手册:http://phi.sinica.edu.tw/aspac/reports/96/96005/
SED单行脚本快速参考:http://sed.sourceforge.net/sed1line_zh-CN.html
附件是 sed 很好的中文教程,忘了从哪本电子书上截取下来的了。其中关于 sed 的处理流程介绍的相当详细,缺点是不够生动。

附件 1: sed.pdf (2006-5-28 00:47, 575.44 K, 下载附件所需积分 1 点 ,下载次数: 48)


  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-5-28 00:47
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 23 楼』:  

谢谢无奈何兄的推荐,基本上已经搞明白了sed的用法,你推荐的东西都相当的棒,只可惜,大部分是台湾同胞写的,习惯上较不同,还能接受。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-28 04:17
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 24 楼』:  

下面是我学习一晚上sed用法的汇报:

test.txt 内容如下:
ab
aa
aaba
b
AbA
bb
bbb
aaaa
cc
AAAA
cccc
aaaaaa
aaaaaab

要求:将test.txt上述字符串中凡是以a(无论大小写)连续的字符串后面加上一个5。

实现的命令:
sedw -ne "/\<[aA]*[aA]\>/s/\([aA]*\)/\15/p" test.txt

执行结果:

D:\work\dos\sed>sedw -ne "/\<[aA]*[aA]\>/s/\([aA]*\)/\15/p" test.txt
aa5
aaaa5
AAAA5
aaaaaa5

命令简单分析:
-n  不输出
-e  后跟脚本,可以有多个-e
/\<[aA]*[aA]\>/  表示查找以连续的a|A组成的字符串所在行, \<及\>定义字符串的开始和结尾
s/\([aA]*\)/\15/p  将连续的a|A字符串替换添加5。\(及\)将连续的a|A串定义为一个组,后面替换操作中用\1来引用这个组。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-28 11:18
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 25 楼』:  

Re Climbing:

      兄实在高看我了,我只有站在大家筑成的十层楼顶,才会有十层楼的水平,否则一切只是虚幻的空中楼阁。

      sed脚本我远没有达到应用随心的地步,基本与兄相似,只有在用到sed脚本时,我才会专门学习与我应用相关的知识,属于半路出家的类型。

      对于grep/sed/awk这三大与正则表达式相关的字符流工具,我认为其处理能力上是依次增加的。grep只能过滤而无法编辑;sed则囿于仅能编辑模式,而awk则因为引入了类C的语法特征,具有了更丰富的处理能力。再加之我只有一定的C语言基础,而缺乏ed等工具的基本认知,所以对awk更加具有认同感,所以现在目前主要的学习方向是awk。

     再就兄24楼的例题略作补缀:

     1、首先,可以将行的查找与串的匹配合二为一,因为这对sed来说,都只是模式匹配。
sed -ne "s/\(\<[aA]*[aA]\>\)/\15/p" test.txt

     2、其次,就你的test.txt而言,全A词等同于全A行,所以可以用行首/行尾元字符进行匹配。
sed -ne "s/\(^[aA]*[aA]$\)/\15/p" test.txt

     3、再次,可以改用[aA]\+来隐含指定词尾为a/A,且至少含有一个a/A。
sed -ne "s/\(^[aA]\+$\)/\15/p" test.txt

[ Last edited by willsort on 2006-5-28 at 22:09 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-5-28 21:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 26 楼』:  

Re wil:

wil兄总是过谦了,你给出的三个答案随便拿一个出来都要比我的高明。可笑的是我竟然以为自己搞通了,惭愧惭愧。不过,还是有一点儿收获,我终于知道了\1, \2这种引用方式。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-5-28 21:54
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: