![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 12:42 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 如何显示文件的最后一行? |
| 可打印版本 4,833 / 25 |
| 第16楼 fan927 | 发表于 2006-05-26 06:26 |
| 初级用户 发帖 31 积分 82 | |
|
说的也是,请教一下,这个*是什么作用吗?多谢Climbing兄.
|
|
| 第17楼 Climbing | 发表于 2006-05-26 10:40 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
在正则表达式中,*表示前面字符从0个到若干个的重复,注意*前面还有一个空格。当然,严格追究,如果最后一行不是若干个ASCII的空格,而是汉字的全角空格或者是制表字符等,恐怕我那个命令也会失效,所以这就要具体情况具体分析了,必要时可以使用正则表达式中的字符集[xyz]来定义要过滤的字符。
sed "/^[ \t]*$" | ... 当然,我不知道上述写法是否正确,对于sed及正则表达式的了解我也只是一知半解。 |
|
| 第18楼 无奈何 | 发表于 2006-05-26 23:34 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
To Climbing
sed 可以用这样的方法过滤掉空行及空白行,而只显示含有有效字符的最后行。 sed -n "/^[ \t]*$/!h;${g;p}" file |
|
| 第19楼 Climbing | 发表于 2006-05-27 17:24 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
Re 无奈何:
请教一下“${g;p}”表示什么操作? |
|
| 第20楼 无奈何 | 发表于 2006-05-27 19:54 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
Re Climbing
这个例子中用到的函数解释如下: h 用模式空间的内容替换保留空间的内容。 g 用保留空间的内容替换模式空间的内容。 p 将模式空间写到标准输出。 前半部分代码的意思是,当当前行不匹配正则时就执行 h 命令,既保存当前行到保留空间。 ${g;p} 的作用是当到达文件末尾时,替换模式空间的内容为此前保存到保留空间的内容,并输出。 |
|
| 第21楼 Climbing | 发表于 2006-05-27 23:14 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
Re 无奈何:
学习了好长时间的sed的帮助,但一直还是搞不太明白sed的高级用法,例如楼上所说 的什么模式空间、保留空间等这些内容。看了你的解释,我更晕了。能不能系统的讲一下有关的概念?最好结合一些例子,看英文的说明,好多不知道什么意思。 有时候,我们经常用正则表达式来寻找一个有特定规律的字符串,然后将这个字符串替换为另一个(但替换后的内容包括查找的内容),例如查找由一串a组成的字符串(a的数量不定),假设找到后替换为原字符串加上一个数字5。我一直不知道如何用sed进行这样的操作。实际上这个问题就是后面的替换操作如何引用前面找到的字符串的问题。 例如: 查找:aaa 找到后替换为:aaa5 查找:aaaa 找到后替换为:aaaa5 希望无奈何兄在这方面再详细讲一下,谢谢! |
|
| 第22楼 无奈何 | 发表于 2006-05-28 00:47 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
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 的处理流程介绍的相当详细,缺点是不够生动。 附件 sed.pdf (575.44 KiB) |
|
| 第23楼 Climbing | 发表于 2006-05-28 04:17 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
谢谢无奈何兄的推荐,基本上已经搞明白了sed的用法,你推荐的东西都相当的棒,只可惜,大部分是台湾同胞写的,习惯上较不同,还能接受。
|
|
| 第24楼 Climbing | 发表于 2006-05-28 11:18 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
下面是我学习一晚上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来引用这个组。 |
|
| 第25楼 willsort | 发表于 2006-05-28 21:15 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re Climbing:
兄实在高看我了,我只有站在大家筑成的十层楼顶,才会有十层楼的水平,否则一切只是虚幻的空中楼阁。 sed脚本我远没有达到应用随心的地步,基本与兄相似,只有在用到sed脚本时,我才会专门学习与我应用相关的知识,属于半路出家的类型。 对于grep/sed/awk这三大与正则表达式相关的字符流工具,我认为其处理能力上是依次增加的。grep只能过滤而无法编辑;sed则囿于仅能编辑模式,而awk则因为引入了类C的语法特征,具有了更丰富的处理能力。再加之我只有一定的C语言基础,而缺乏ed等工具的基本认知,所以对awk更加具有认同感,所以现在目前主要的学习方向是awk。 再就兄24楼的例题略作补缀: 1、首先,可以将行的查找与串的匹配合二为一,因为这对sed来说,都只是模式匹配。 sed -ne "s/\(\<*\>\)/\15/p" test.txt 2、其次,就你的test.txt而言,全A词等同于全A行,所以可以用行首/行尾元字符进行匹配。 sed -ne "s/\(^*$\)/\15/p" test.txt 3、再次,可以改用\+来隐含指定词尾为a/A,且至少含有一个a/A。 sed -ne "s/\(^\+$\)/\15/p" test.txt [ Last edited by willsort on 2006-5-28 at 22:09 ] |
|
| 第26楼 Climbing | 发表于 2006-05-28 21:54 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
Re wil:
wil兄总是过谦了,你给出的三个答案随便拿一个出来都要比我的高明。可笑的是我竟然以为自己搞通了,惭愧惭愧。不过,还是有一点儿收获,我终于知道了\1, \2这种引用方式。 |
|
| 上一页 1 2 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |