[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本人找到的功能较全的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 编辑 ]
8

评分人数

***共同提高***

第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

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

连载二

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
复制代码
***共同提高***

TOP

连载三

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 编辑 ]
***共同提高***

TOP

连载四

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 编辑 ]
***共同提高***

TOP

连载五

文本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
复制代码
这也是一个循环。
***共同提高***

TOP

连载六

有a.txt内容如下:
  1. 1:When I was a little girl, I found love in a box all because of a class assignment.
  2. 2:On a Friday night I made an announcement at the dinner table.
  3. 3:The words bubbled out in a torrent of excitement I could no longer contain.
  4. 4:“My teacher said we have to bring a box for our valentines on Monday.
  5. 5:But it has to be a special box, all decorated.”
  6. 6:Mother said, “We’ll see,” and she continued eating.
  7. 7:I wilted faster than a flower with no water.
  8. 8:What did “We’ll see” mean?
  9. 9:I had to have that box or there would be no valentines for me.
  10. 10:My second grade Valentine’s Day would be a disaster.
复制代码
41、根据用户输入的内容"pause"来取代第5-8行所有的内容(非每行)
  1. sed "5,8c\pause" a.txt
复制代码
c开关是sed中用用户输入内容来取代原本内容的,其后紧跟"\",用这种方法同样可以将指定行替换为空行(并不是严格意义上的空行,至少有一个空格),如:sed "9c\ " a.txt。
42、根据用户输入的内容"pause"来取代文本所有的行
  1. sed "1,$c\pause" a.txt
复制代码
1,$表示的是从第一行到最后一行
43、删除文本所有行首的四个字符
  1. sed "s/^....//" a.txt
复制代码
其实就是将行首的四个字符替换为空。
44、删除文本所有行尾的四个字符
  1. sed "s/....$//" a.txt
复制代码

45、将文本行右移四个字符位
  1. sed "s/^/    /" a.txt
复制代码

即将行首(实际是一个空字符)替换为四个空格,也就在每行前加入了四个空格而将行右移了四位。

[ 本帖最后由 batman 于 2008-9-26 13:29 编辑 ]
***共同提高***

TOP

Vkill兄的网站上有sed4.1.4的单行本
http://www.vkill.net/tools.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

看来sed真的非常强大。

TOP

连载七
大家如果使用了本人在顶楼提供的sed,会发现其帮助信息是纯英文版的,实际上现在网
上能找到的sed版本,其帮助信息都是没有经过翻译的,于是,本人特将其帮助信息进行
了汉译整理并对照如下(不能说是翻译,因为有的信息直译过来根本是讲不通的)
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
用法:sed[选项]...{脚本-如果没有其它脚本}[输入文件]
  -n, --quiet, --silent
  -n, --安静模式
                 suppress automatic printing of pattern space
     禁止自动输出模本空间(意即将输出定向到由命令控制)
  -e script, --expression=script
  -e 脚本,--表达式=脚本
                 add the script to the commands to be executed
     添加脚本的命令将被执行(-e是个命令连接开关,在第二个-e前第一个-e后的命令将首先被执行完,意即执行完一条命令后再执行后面的命令)
  -f script-file, --file=script-file
  -f 脚本文件        
                 add the contents of script-file to the commands to be executed
     从文本中读取命令并执行
  -i[suffix], --in-place[=suffix]
  -i[后缀]
                 edit files in place (makes backup if extension supplied)
     在符合条件的文本行后添加指定内容(之前是-a)
  -l N, --line-length=N
  -l N,--线长度=N
                 specify the desired line-wrap length for the `l' command
     用-l N语法来指定线(字符数,循环次数,行数)长度
  -r, --regexp-extended
  -r, --表达式延展
                 use extended regular expressions in the script.
                 扩展脚本中的正则表达式
  -s, --separate
  -s,--分割替换
                 consider files as separate rather than as a single continuouslong stream.
     将文本行分割为单独的字符串来进行替换
  --text     switch to text mode
  --text     切换到文本模式
  -u, --unbuffered
 -u,--无缓冲
                 load minimal amounts of data from the input files and flushthe output buffers more often
              从输入文件中加载数据并保持输出的刷新(非常用语法)    
      --help     display this help and exit
   --help  显示帮助信息
  -V, --version  output version information and exit
  -V, --版本 输出版本信息
  If no -e, --expression, -f, or --file option is given, then the firstnon-option argument is taken as the sed script to interpret.  All remaining arguments are names of input files; if no input files arespecified, then the standard input is read.
  如果没有-e开关,表达式,-f开关,或者给出的文件选项,那么将会首先输出sed脚本的帮助信息,如果仅仅是后面没有输入文件,那么程序将会接收使用者键盘输入的指令。
  E-mail bug reports to: [email]bonzini@gnu.org[/email] .
  Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
  报错电子信箱:bonzini@gnu.org。
  请务必在邮件(标题)中注明“sed”“来自于那个领域”的关键词。

[ 本帖最后由 batman 于 2008-10-6 17:08 编辑 ]
1

评分人数

    • taofan712: 临帖泣零,感激之心无以言表技术 + 1
***共同提高***

TOP

看着头都大了~
想知道sed中有无perl风格的正则表达式元字符用法,比如用\r表示一个回车 \n表示一个换行,\d+能匹配至少有一个数字的纯数字串等~

[ 本帖最后由 pusofalse 于 2008-10-11 19:25 编辑 ]
心绪平和,眼藏静谧。

TOP

我用他输入13-20的文字到另外一个文件,但是生成的文件之间有一个ctr+v生成的黑点,如何去掉??

TOP

sed 输出的黑点着实烦人, 一直没找到解决办法,
即使换了字体看不到黑点,也无法正常换行.

TOP

回复 13楼 的帖子

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

30行

  1. sed "/./=" a.txt|sed "/./N; s/\n/:/"
  2. ::管道命令前面是把每行前插入一行 存放行号
  3. ::管道命令后面是在之前的命令结果基础上,把插入的行号之后的换行符替换成":"
复制代码
  1. sed "/./=" a.txt|sed "/./n; s/\n/:/"
  2. ::如果把N换成n 的话 管道命令后面的sed不会执行也就是没有替换成功
  3. ::这里只显示管道命令前面的命令结果
复制代码
为什么呢? 区分大小写?
而且 命令执行正确的话 不是在行后插入行号
格式是:
      行号:行内容

[ 本帖最后由 a590687 于 2010-1-21 19:30 编辑 ]

TOP

返回列表