请选择 进入手机版 | 继续访问电脑版

 找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 150746|回复: 32

[原创教程] 一起来学习强大的sed(连载)

[复制链接]
发表于 2008-9-24 20:37:14 | 显示全部楼层 |阅读模式
本人找到的功能较全的sed.exe 4.14 http://bbs.bathome.net/thread-1114-1-1.html
注:本人是sed新手,下面所叙述的也是本人的学习心得,还请大家补充和指正
有文本a.txt内容如下:
  1. a-1
  2. a-2
  3. a-3
  4. 1-a
  5. 2-a
  6. 3-a
  7. b-1
  8. b-2
  9. b-3
复制代码
1、显示所有含有字符"a"的行
  1. sed -n "/a/p" a.txt
复制代码
-n开关是表示输出由编辑指令控制,p开关是有条件显示开关,在些处就是仅显示有"a"字符的行。
2、显示所有以字符"a"开头的行
  1. sed -n "/^a/p" a.txt
复制代码
符号"^"在这里不是起到转义的作用而是表示行的开始,这个和findstr中的用法是一样的。
3、不显示所有含有"a"字符的行
  1. sed "/a/d" a.txt
复制代码
d开关是表示删除的意思。
4、不显示所有以"a"字符开头的行
  1. sed "/^a/d" a.txt
复制代码
5、将文本中所有的"b"字符替换为"bathome"
  1. sed "s/b/bathome/" a.txt
复制代码
s开关是替换开关,开启此开关后将会将第一个//间的字符替换为第二个//间的字符。
6、将文本中以"a"开头的行全部替换为"bathome"
  1. sed "s/^a.*/bathome/" a.txt
复制代码
7、不显示文本中前5行
  1. sed 1,5d a.txt
复制代码
即为删除文本前期前5行。
8、显示文本中5-8行
  1. sed -n 5,8p a.txt
复制代码
一样的要用-n开关先将输出定向到编辑指令控制。
9、将文本中所有"a"替换为"A",同时删除所有含有字符"-1"的行,并将所有以"b"开头的行替换为"bathome"
  1. sed -e "s/a/A/" -e "/-1/d" -e "s/^b.*/bathome/" a.txt
复制代码
-e开关是sed中多个命令的连接开关。
10、删除除了以"3"字符打头的行以外的所有行
  1. sed "/^3/!d" a.txt
复制代码
!开关是表示以什么样的条件不执行命令,在这里就是碰到以"3"字符打头的行不执行删除命令。

[ 本帖最后由 Batcher 于 2009-5-1 21:09 编辑 ]

评分

参与人数 8PB +31 技术 +2 收起 理由
yhcfsr + 1 收藏,好文章
mxxcgzxxx + 1 强大的一定要顶
Hello123World + 5 好!
jinzeyu + 3 感谢
yslyxqysl + 3 强大命令,强大解释

查看全部评分

发表于 2008-9-24 21:39:37 | 显示全部楼层
第5点,关于s的解释,可能这样更准确:
sed 's/foo/bar/' # replaces only 1st instance in a line
sed 's/foo/bar/4' # replaces only 4th instance in a line
sed 's/foo/bar/g' # replaces ALL instances in a line
sed '1s/foo/bar/' # replaces only 1st instance in 1st line

评分

参与人数 1技术 +1 收起 理由
yhcfsr + 1 感谢分享

查看全部评分

 楼主| 发表于 2008-9-24 22:12:32 | 显示全部楼层

连载二

a.txt内容如下:
  1. 1-a a-1 aa
  2. 2-a a-2 aa
  3. 3-a a-3 aa
  4. 4-a a-4 aa
  5. 5-a a-5 aa
复制代码
11、将文本中每行第二个"a"替换为"b"
  1. sed "s/a/b/2" a.txt
复制代码
12、将文本中每行所有的"a"替换为"b"
  1. sed "s/a/b/g" a.txt
复制代码
13、将文本中第1-3行中第三个"a"替换为"b"
  1. sed "1,3s/a/b/3" a.txt
复制代码
14、将文本中第3-5行中第一、三个"a"替换为"b"
  1. sed -e "3,5s/a/b/1" -e "3,5s/a/b/3" a.txt
复制代码
15、除了第四行外将所有行的第二个"a"替换为"b"
  1. sed "4!s/a/b/2" a.txt
复制代码
 楼主| 发表于 2008-9-25 23:44:40 | 显示全部楼层

连载三

a.txt内容如下:
  1. 1:basktop at time to door

  2. 2:basktop at time to door

  3. 3:bathome is webbbs

  4. 4:you can not do it

  5. 5:yes you need to watch the game

  6. 6:he is write for bat

  7. 7:he is write for bat

  8. 8:you can not do it
复制代码
16、删除文本中所有的空行
  1. sed "/^$/d" a.txt
复制代码
"^"表示行的开始,"$"表示行的结束,用"^$"就表示空行,用d开关将所有的空行删除。
17、删除文本最后一行
  1. sed $d a.txt
复制代码
也可先用n开关来将输出定向到编辑指令,然后用p开关来显示所有的
行,并用$!来屏蔽最后一行:sed -n $!p a.txt。
18、删除文本中第2行到第一个"write"所在行之间所在的所有内容(含这个"write"所在行)
  1. sed "2,/write/d" a.txt
复制代码
19、在含有"need"字符的所在行后插入"批处理"字符(另起一行)
  1. sed "/need/a\批处理" a.txt
复制代码
a开关是表示在文本中插入内容,后面必须要跟上"\"
20、在文本中每行后插入"批处理"字符(另起一行)
  1. sed "a\批处理" a.txt
复制代码
当a开关前没有任何条件限制时"\"后面所跟的任何字符将被当做插入内容而通篇插入。
21、在文本中每行前插入"批处理"字符(前一行)
  1. sed "i\批处理" a.txt
复制代码
22、在文本中含有"write"字符的行前插入"批处理"字符(前一行)
  1. sed "/write/i\批处理" a.txt
复制代码
i开关的作用和a开关相似,只是插入的位置是一前一后。
23、显示文本的奇数行(含空行)
  1. sed -n -e "p" -e "n" a.txt
复制代码
在sed中用n表示奇数行,用p表示偶数行。
24、显示文本的偶数行(含空行)
  1. sed -n -e "n" -e "p" a.txt
复制代码
在此处只会显示7行空行。
25、统计行数
  1. sed -n "$=" a.txt
复制代码
这个没有多说的,大家记住就好了。

[ 本帖最后由 batman 于 2008-9-26 11:49 编辑 ]
 楼主| 发表于 2008-9-26 00:48:59 | 显示全部楼层

连载四

a.txt内容如下:
  1. we he she they
  2. we he she they
  3. they our his him my
  4. we he she they
  5. my me you your her
  6. they our his him my
复制代码
26、将指定字符进行变形
  1. sed "s/\(t\)\(h\)\(e\)\(y\)/\4\1\3\2/" a.txt
复制代码
在这里所有"\'都是转义符,而\4就代表前面字符串中的第4个字符,其它以此类推,再用s开关进行替换,就达到了将字符进行变形的目的,如是4321的顺序则将指定字符进行了反转。
27、将整行字符进行反转
  1. sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//" a.txt
复制代码
关于这个本人也没有理解过来,大家先死记住就好了。
28、删除重复行(保留本行)
  1. sed -n "G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P" a.txt
复制代码
一样是死记,本人觉得不如bat。
29、显示3的倍数行
  1. sed -n "n;n;p" a.txt
复制代码
先用n开关将输出定向到编辑指令,然后输入法3-1个n;最后用显示开
关p结尾,也就时说3前的数字的倍数行不显示,只显示3的倍数行。
30、在所有的行下加上行号将在行号加上字符":"
  1. sed "/./=" a.txt|sed "/./N; s/\n/:/"
复制代码
这是sed的一个正则表达式,先是自己定义/./的值是a.txt,这个是必须定义的,如直接写成sed "/a.txt/n;s/\n/:/"是会出错的,后面的s/\n/:/是表示用":"来做分隔符,如省去则会默认将一个空行来做为分隔符,这样行号就变成了插入在本行前面了,";"是个命令连接符。
31、在行首插入字符(含空格)
  1. sed "s/^/bathome/" a.txt
复制代码
其实就是用s开关将行首的空字符替换为要插入的字符,那么在行尾增加字符便可写成sed "s/$/bathome/" a.txt。
32、在每行后增加一空行
  1. sed G a.txt
复制代码
不多说了,这个简单好记。
33、在每行后增加5行空行
  1. sed "G;G;G;G;G;G" a.txt
复制代码
这个好理解,增加多少行就写多少个G;最后用G结束。
34、在含有"me"字符的行后增加一空行
  1. sed "/me/G" a.txt
复制代码
35、在含有"me"字符的行前增加一空行
  1. sed "/me/{x;p;x;}" a.txt
复制代码
这个比较复杂点,大家只要记住这种用法就好了。

[ 本帖最后由 batman 于 2008-9-26 11:50 编辑 ]
 楼主| 发表于 2008-9-26 01:40:23 | 显示全部楼层

连载五

文本a.txt内容如下
  1. 123456789
  2. abcdefg
  3. gfabced
  4. 1790562.4345
  5. 批处理 bat
复制代码
36、将文本右对齐
  1. sed -e :a -e "s/^.\{1,79\}$/ &/;ta" a.txt
复制代码
在这里":a"是sed在每行行首设立的用来跳转的标签,再由后面的t开关来检测在
本行命令是否执行完,没有执行完则继续执行,执行完了则跳转到下一个:a标签
处(也就是跳到下一行),这就其实是一个循环了,同时要说明一下的是"&"是表
示的前面命令中保存的字符也就是每行原有的字符,前面的" "则是自动在行前补
空格,当然我们也可以改成任意字符。另要说明的虽然默认的一行有80个字符,
但在这里最多只能设为79,当然这个数字我们也可以修改。
37、将文本内容居中
  1. sed -e a: -e "s/^.\{1,79\}$/ & /;ta" a.txt
复制代码
如果大家理解了上面36中的命令,相信这个命令就没问题了,同理将本来不是左
对文的文本进行左对齐也就没问题了。
38、显示文本含有数字的行
  1. sed -n "/[0-9]/p" a.txt
复制代码
这一用法和findstr极为相似,同理删除含数字行就是sed "/[0-9]/d" a.txt。
39、将文本中的字母换成大写
  1. sed "y/abcdefg/ABCDEFG/" a.txt
复制代码
y开关是sed中真正的变形开关,同理可以将文本中的数字全变成大写数字。
40、将文本中数字加上,分隔符
  1. sed -e :a -e "s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta" a.txt
复制代码
这也是一个循环。
<