中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 01:33
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » 【共享】P者,sed不可不学
可打印版本  10,719 / 45
第31楼 sylovanas 发表于 2008-06-02 21:34
初级用户 发帖 42 积分 107
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 "/^.*$/p" 1.1.txt
abc
a啊
ccc

可以用
第32楼 sylovanas 发表于 2008-06-02 21:41
初级用户 发帖 42 积分 107
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
第33楼 plp626 发表于 2008-06-03 07:11
银牌会员 发帖 1,020 积分 2,278
Originally posted by sylovanas at 2008-6-2 09:34 PM:


C:\1>type 1.1.txt
abc
a啊

啊a


C:\1>sed -n "/^.*$/p" 1.1.txt
abc
a啊
ccc

可以用

多了一个点:
第34楼 HAT 发表于 2008-06-03 09:31
版主 发帖 5,017 积分 9,023
Originally posted by sylovanas at 2008-6-2 09:34 PM:


C:\1>type 1.1.txt
abc
a啊

啊a


C:\1>sed -n "/^.*$/p" 1.1.txt
abc
a啊
ccc

可以用

楼主的要求是获取纯英文的行,加上那个点以后,就无法得到正确结果了。
第35楼 HAT 发表于 2008-06-03 09:33
版主 发帖 5,017 积分 9,023
Originally posted by plp626 at 2008-6-3 07:11 AM:

多了一个点:

不加那个点也不对,见26楼描述。
第36楼 pooronce 发表于 2008-06-03 10:09
中级用户 发帖 250 积分 484
Originally posted by HAT at 2008-6-3 09:33 AM:

不加那个点也不对,见26楼描述。


不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:

第37楼 pooronce 发表于 2008-06-03 10:22
中级用户 发帖 250 积分 484
简单测试了一下,发现-r参数可以支持+符号的,那么简单了:


第38楼 pooronce 发表于 2008-06-03 10:26
中级用户 发帖 250 积分 484
btw:说明一下,以免还不熟的朋友搞混了:
* 代表匹配前面的字符任意次,所以包括0次
+ 代表匹配1次以上

另外还有
? 代表0或1次

不过sed支持有限,具体支持哪些还没试过。

另,论坛有shell标准用吗?就是引用一块黑的类DOS显示块来。
第39楼 HAT 发表于 2008-06-03 11:45
版主 发帖 5,017 积分 9,023
Originally posted by pooronce at 2008-6-3 10:09 AM:


不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:


关键不是空行的问题,而是能否匹配纯英文行的问题。
你的代码能正确匹配吗?
abc
a啊

啊a
第40楼 pooronce 发表于 2008-06-03 11:48
中级用户 发帖 250 积分 484
Originally posted by HAT at 2008-6-3 11:45 AM:

关键不是空行的问题,而是能否匹配纯英文行的问题。
你的代码能正确匹配吗?




你再试试?
btw: 你的sed是哪类的,什么版本?
我的:
第41楼 HAT 发表于 2008-06-03 12:07
版主 发帖 5,017 积分 9,023
可能是我的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.
第42楼 26933062 发表于 2008-06-08 21:08
银牌会员 发帖 879 积分 2,268
Originally posted by HAT at 2008-6-1 01:34:
13,如果某行多于10个字符,只显示每一行的前10个字符

我知道这样可以查找出多余10个字符的行,但是不知道怎样只显示前10个字符。
第43楼 ngd 发表于 2008-06-19 13:59
中级用户 发帖 108 积分 312
1,怎样显示一个文本的前10行?最后1行?







2,将文本的“;”“,”作为换行符其他字符不变?


3,显示文本第20行到25行之间的内容?



4,显示文本的奇数行?偶数行?



5,在文本里包含"爱你"的字符换成”【爱你】“,包含“恨你”的字符换成"(恨你)"输出?


6,将文本里的这些字符%:^?<>*/\|&全部替换为空格?


7,怎么显示纯英文行,中文行?中英文混合行?
利用ASCII码区分中英文
在ASCII码中,第0~32号及第127号(共34个)为控制字符或通讯专用字符
关于汉字编码,以GB2312码为例,是以两个ASCII字符为一个汉字编码,而且用的都是ASCII中扩展字符集(从128号到255号)中的编码组成






8,将奇偶行拼接成一行,比如12行合并,34行合并....?


9,如果当前行是以"我"字开头,怎么将它合并到上一行?


10,将每一行首、尾、的所有空格删除?


11,给每一行的开头加上"echo"?


12,如果某行的行尾是以"。"结尾,就删除"。"


13,如果某行多于10个字符,就只显示该行前10个字符?


14,如果某行包含数字,以20个字符为宽度将数字右对齐?


15,倒置所有行,第一行成为最后一行,依次类推.....


16,将行中的字符逆序排列,第一个字成为最后一字,……


17,在每5行后增加一空白行


18,显示所有重复行



19,在每行的第5个与第6个字符之间插入”/*“,第10与第11个字符之间插入"*/"。如果某行少于11个字符补空格后插入。


20,对一个文件夹下的N个TXT文件进行处理,对每一个TXT里的每一行前面都加入000


21,分割文本,将其1到100行保存为a_1.txt,101-200行保存为a_2.txt,以此类推...


22,按如下顺序重新排列行数:1,11;2,12;...;9,19;10,20;后面的行以此类推(每20行一个周期)


23,A文本每行插入到B文本中对应行后面,例如,A的第一行插到B的第一行后面,A的第二行插到B的第二行后面,以此类推。。。


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)字元。
第44楼 HAT 发表于 2008-06-19 18:26
版主 发帖 5,017 积分 9,023
21,分割文本,将其1到100行保存为a_1.txt,101-200行保存为a_2.txt,以此类推...

用split比较简单,有必要的话再修改一下分割后的文件名就行了。
第45楼 HAT 发表于 2008-06-21 04:41
版主 发帖 5,017 积分 9,023
Originally posted by ngd at 2008-6-19 01:59 PM:
9,如果当前行是以"我"字开头,怎么将它合并到上一行?



我来试着解释一下吧,如果不当之处,望大家指正。
假设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: 蓝色字符表示模式空间的内容
上一页  1 2 3 4  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023