中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
<   <<   [1] [2] [3] [4]  >>   >
作者:
标题: 【共享】P者,sed不可不学 上一主题 | 下一主题
sylovanas
初级用户





积分 107
发帖 42
注册 2007-9-3
状态 离线
『第 31 楼』:  

Originally posted by HAT at 2008-6-1 02:04 AM: 这个正则表达式写的很正确,在Unix下可以得到正确结果,但是在cmd下调用sed.exe却得不到任何结果。
C:\1>type 1.1.txt abc a啊 啊 啊a 我 C:\1>sed -n "/^[a-z A-Z].*$/p" 1.1.txt abc a啊 ccc 可以用


2008-6-2 21:34
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
sylovanas
初级用户





积分 107
发帖 42
注册 2007-9-3
状态 离线
『第 32 楼』:  

13,如果某行多于10个字符,就只显示该行前10个字符? C:\1>type 1.1.txt 1111111111 2222 3333333 444444444444 C:\1>sed -r "/.{10}/!d;s/(.{1,10}).*$/\1/" 1.1.txt 1111111111 4444444444


   此帖被 +7 点积分      点击查看详情   
评分人:【 plp626 分数: +7  时间:2008-6-3 07:12


2008-6-2 21:41
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 33 楼』:  

Originally posted by sylovanas at 2008-6-2 09:34 PM: C:\1>type 1.1.txt abc a啊 啊 啊a 我 C:\1>sed -n "/^[a-z A-Z].*$/p" 1.1.txt abc a啊 ccc 可以用
多了一个点:
sed -n "/^[a-z A-Z]*$/p" a.txt




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-6-3 07:11
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 34 楼』:  

Originally posted by sylovanas at 2008-6-2 09:34 PM: C:\1>type 1.1.txt abc a啊 啊 啊a 我 C:\1>sed -n "/^[a-z A-Z].*$/p" 1.1.txt abc a啊 ccc 可以用
楼主的要求是获取纯英文的行,加上那个点以后,就无法得到正确结果了。




2008-6-3 09:31
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 35 楼』:  

Originally posted by plp626 at 2008-6-3 07:11 AM: 多了一个点:
sed -n "/^[a-z A-Z]*$/p" a.txt
不加那个点也不对,见26楼描述。




2008-6-3 09:33
查看资料  发短消息  网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 36 楼』:  

Originally posted by HAT at 2008-6-3 09:33 AM: 不加那个点也不对,见26楼描述。
不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:
sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file


2008-6-3 10:09
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 37 楼』:  

简单测试了一下,发现-r参数可以支持+符号的,那么简单了:
sed -r -e "/^[a-zA-Z]+$/!d" file
F:\tptst>np file

F:\tptst>type file
adfadfadfasdfasdfadf
4trqefddafKKLFDK:D
JJDJEXDSLDD


da13431431
o9590415143
ABCDE
BDEFG
BBDkkDDlda

;adfazxx13!#$#
F:\tptst>sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file
adfadfadfasdfasdfadf
JJDJEXDSLDD
ABCDE
BDEFG
BBDkkDDlda

F:\tptst>sed -r -e "/^[a-zA-Z]+$/!d" file
adfadfadfasdfasdfadf
JJDJEXDSLDD
ABCDE
BDEFG
BBDkkDDlda


2008-6-3 10:22
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 38 楼』:  

btw:说明一下,以免还不熟的朋友搞混了: * 代表匹配前面的字符任意次,所以包括0次 + 代表匹配1次以上 另外还有 ? 代表0或1次 不过sed支持有限,具体支持哪些还没试过。 另,论坛有shell标准用吗?就是引用一块黑的类DOS显示块来。


2008-6-3 10:26
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 39 楼』:  

Originally posted by pooronce at 2008-6-3 10:09 AM: 不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:
sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file
关键不是空行的问题,而是能否匹配纯英文行的问题。 你的代码能正确匹配吗?
abc a啊 啊 啊a 我




2008-6-3 11:45
查看资料  发短消息  网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 40 楼』:  

Originally posted by HAT at 2008-6-3 11:45 AM: 关键不是空行的问题,而是能否匹配纯英文行的问题。 你的代码能正确匹配吗?
F:\tptst>type file
adfadfadfasdfasdfadf
4trqefddafKKLFDK:D
JJDJEXDSLDD

我你他
a你我
他abcd你我
人民的常b

da13431431
o9590415143
ABCDE
BDEFG
BBDkkDDlda

;adfazxx13!#$#
F:\tptst>sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file
adfadfadfasdfasdfadf
JJDJEXDSLDD
ABCDE
BDEFG
BBDkkDDlda

F:\tptst>sed -r -e "/^[a-zA-Z]+$/!d" file
adfadfadfasdfasdfadf
JJDJEXDSLDD
ABCDE
BDEFG
BBDkkDDlda
你再试试? btw: 你的sed是哪类的,什么版本? 我的:
F:\tptst>sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.


2008-6-3 11:48
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 41 楼』:  

可能是我的sed版本太低吧, 我去找个高版本的试试。
C:\Test>sed --version GNU sed version 3.02 Copyright (C) 1998 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law.




2008-6-3 12:07
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 42 楼』:  

[quote]Originally posted by HAT at 2008-6-1 01:34: 13,如果某行多于10个字符,只显示每一行的前10个字符 我知道这样可以查找出多余10个字符的行,但是不知道怎样只显示前10个字符。
sed -n &qu ... [/quote]
[code]
:查找出多余10个字符的行 ,但只显示后面的10个字符
sed -n "/^.\{10\}/s/\(^.\{10\}\)\(.\{10\}\).*/\2/p" a.txt

:查找出多余10个字符的行,但只显示前10个字符
sed -n "/^.\{10\}/s/\(^.\{10\}\).*/\1/p" a.txt


   此帖被 +8 点积分        点击查看详情   
评分人:【 moniuming 分数: +8  时间:2008-10-3 13:39




致精致简!
2008-6-8 21:08
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ngd
中级用户

拟谷盗


积分 312
发帖 108
注册 2007-1-21
状态 离线
『第 43 楼』:  

1,怎样显示一个文本的前10行?最后1行?
 sed "10q" a.txt 
 sed -n "1,10p" a.txt 
 sed "1,10!d" a.txt 
 sed "11,$d" a.txt 
 sed "$!d" a.txt 
 sed -n "$p" a.txt 
2,将文本的“;”“,”作为换行符其他字符不变?
 sed "s/;/\n/g;s/,/\n/g" a.txt 
3,显示文本第20行到25行之间的内容?
 sed "20,25!d" a.txt 
 sed -n "20,25p" a.txt 
4,显示文本的奇数行?偶数行?
 sed -n "p;n" a.txt 
 sed -n "n;p" a.txt 
5,在文本里包含"爱你"的字符换成”【爱你】“,包含“恨你”的字符换成"(恨你)"输出?
 sed "s/爱你/【爱你】/g;s/恨你/【恨你】/g" a.txt 
6,将文本里的这些字符%:^?<>*/\|&全部替换为空格?
 sed "s/[%:^?<>*/\|&]/ /g" a.txt 
7,怎么显示纯英文行,中文行?中英文混合行? 利用ASCII码区分中英文 在ASCII码中,第0~32号及第127号(共34个)为控制字符或通讯专用字符 关于汉字编码,以GB2312码为例,是以两个ASCII字符为一个汉字编码,而且用的都是ASCII中扩展字符集(从128号到255号)中的编码组成
 sed -n "/^[\x21-\x7E]*$/p" a.txt 
 sed -n "/^[\x80-\xFF]*$/p" a.txt 
 sed -n "/[\x21-\x7E][\x80-\xFF]\|[\x80-\xFF][\x21-\x7E]/p" a.txt 
8,将奇偶行拼接成一行,比如12行合并,34行合并....?
 sed "N;s/\n/ /" a.txt 
9,如果当前行是以"我"字开头,怎么将它合并到上一行?
 sed ":a;$!N;s/\n我/我/;ta;P;D" a.txt 
10,将每一行首、尾、的所有空格删除?
 sed "s/^ *//;s/ *$//" a.txt 
11,给每一行的开头加上"echo"?
 sed "s/^/echo/" a.txt 
12,如果某行的行尾是以"。"结尾,就删除"。"
 sed "s/。$//" a.txt 
13,如果某行多于10个字符,就只显示该行前10个字符?
 sed "s/\(^.\{10\}\).*/\1/" a.txt 
14,如果某行包含数字,以20个字符为宽度将数字右对齐?
 sed ":a;/[0-9]/s/^.\{,19\}$/ &/;ta" a.txt 
15,倒置所有行,第一行成为最后一行,依次类推.....
 sed "1!G;h;$!d" a.txt 
16,将行中的字符逆序排列,第一个字成为最后一字,……
 sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//" a.txt 
17,在每5行后增加一空白行
 sed "n;n;n;n;G" a.txt 
18,显示所有重复行
 sed -n "G;s/\n/&&/;/^\(.*\n\).*\n\1/{P;d};s/\n//;h" a.txt 
@echo off
for /f "delims=" %%a in (a.txt) do (
	if /i defined %%a (echo %%a) else set %%a=a
)
19,在每行的第5个与第6个字符之间插入”/*“,第10与第11个字符之间插入"*/"。如果某行少于11个字符补空格后插入。
 sed -e "s/^.\{,10\}$/&          /;s/\(^.\{11\}\) *$/\1/;s`\(^.....\)\(.....\)\(.*\)`\1/*\2*/\3`" a.txt 
20,对一个文件夹下的N个TXT文件进行处理,对每一个TXT里的每一行前面都加入000
@echo off
for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
	sed "s/^/000/w tmp_.txt" "%%a"
	move tmp_.txt "%%a"
)
21,分割文本,将其1到100行保存为a_1.txt,101-200行保存为a_2.txt,以此类推...
@echo off
for /f %%i in ('sed -n "$=" a.txt') do set number=%%i
:loop
set /a num+=1
set /a n=(%num%-1)*100+1
set /a m=100*%num%
sed "%n%,%m%w a_%num%.txt" a.txt
if %m% LSS %number% goto :loop
22,按如下顺序重新排列行数:1,11;2,12;...;9,19;10,20;后面的行以此类推(每20行一个周期)
@echo off
for /f %%i in ('sed -n "$=" a.txt') do set num=%%i
:loop
set /a n+=1,count+=1
sed -n %n%p a.txt
set /a m=10+%n%
sed -n %m%p a.txt
if %count% EQU 10 set /a n+=10 & set count=0
if %n% LSS %num% goto :loop
pause
23,A文本每行插入到B文本中对应行后面,例如,A的第一行插到B的第一行后面,A的第二行插到B的第二行后面,以此类推。。。
@echo off
for /f %%i in ('sed -n "$=" a.txt') do set num=%%i
for /f %%i in ('sed -n "$=" b.txt') do set num2=%%i
if %num% LSS %num2% set num=%num2%
:loop
set /a n+=1
sed -n %n%p b.txt>>ba_tmp.txt
sed -n %n%p a.txt>>ba_tmp.txt
if %n% LSS %num% goto :loop
move ba_tmp.txt b.txt
sed函数参数 功能 : label 建立 script file 内指令互相参考的位置。 # 建立注解 { } 集合有相同位址参数的指令。 ! 不执行函数参数。 = 印出资料行数( line number )。 a\ 添加使用者输入的资料。 b label 将执行的指令跳至由 : 建立的参考位置。 c\ 以使用者输入的资料取代资料。 d 删除资料。 D 删除 pattern space 内的第一行资料。 g 拷贝资料从 hold space 至 pattern space 。 G 添加资料从 hold space 至 pattern space 。 h 拷贝资料从 pattern space 至 hold space 。 H 添加资料从 pattern space 至 hold space 。 l 印出 l 资料中的 nonprinting character 用 ASCII 码。 i\ 插入添加使用者输入的资料行。 n 读入下一笔资料到 pattern space。 N 添加下一笔资料到 pattern space。 p 印出资料。 P 印出 pattern space 内第一个行的资料。 q 跳出 sed 编辑。 r 读入它档内容。 s 替换字串。 t label 先执行一替换的编辑指令,如果替换成功,则将编辑指令跳至 : label 处执行。 w 写资料到它档内。 x 交换 hold space 与 pattern space 内容。 y 转换(transform)字元。


   此帖被 +35 点积分       点击查看详情   
评分人:【 plp626 分数: +15  时间:2008-6-20 00:09
评分人:【 lxmxn 分数: +20  时间:2008-6-20 02:58




FLOSS
2008-6-19 13:59
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 44 楼』:  

21,分割文本,将其1到100行保存为a_1.txt,101-200行保存为a_2.txt,以此类推...
split -100 a.txt
用split比较简单,有必要的话再修改一下分割后的文件名就行了。




2008-6-19 18:26
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 45 楼』:  

Originally posted by ngd at 2008-6-19 01:59 PM: 9,如果当前行是以"我"字开头,怎么将它合并到上一行?
sed ":a;$!N;s/\n我/我/;ta;P;D" a.txt
我来试着解释一下吧,如果不当之处,望大家指正。 假设a.txt内容如下:
aaa bbb 我ccc ddd
sed首先读入第一行到模式空间 aaa\n :a跟批处理中的跳转语句的标签类似 $!N表示除了文本的最后一行之外其余的行全部要执行N命令(把当前行的下一行以追加的方式读入模式空间) aaa\nbbb\n s/\n我/我/;ta;匹配失败,执行P命令(打印模式空间中的第一行aaa\n) 执行D命令(删除模式空间中的第一行aaa\n) bbb\n 模式空间不空,从头执行:a $!N bbb\n我ccc\n s/\n我/我/匹配成功 bbb我ccc\n ta;跳转到标签:a $!N bbb我ccc\nddd\n s/\n我/我/;ta;匹配失败,执行P命令(打印模式空间中的第一行bbb我ccc\n) 执行D命令(删除模式空间中的第一行bbb我ccc\n) ddd\n 模式空间不空,从头执行:a $!N ddd\n s/\n我/我/;ta;匹配失败,执行P命令(打印模式空间中的第一行ddd\n) 执行D命令(删除模式空间中的第一行ddd\n) 模式空间为空,sed命令结束。 PS: 蓝色字符表示模式空间的内容


   此帖被 +15 点积分       点击查看详情   
评分人:【 plp626 分数: +7  时间:2008-6-30 23:55
评分人:【 moniuming 分数: +8  时间:2008-10-3 13:27




2008-6-21 04:41
查看资料  发短消息  网志   编辑帖子  回复  引用回复
<   <<   [1] [2] [3] [4]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: