Board logo

标题: 【共享】P者,sed不可不学 [打印本页]

作者: plp626     时间: 2008-5-31 04:22    标题: 【共享】P者,sed不可不学

大家在这个帖子里尽管讨论文本,字符处理的问题,但是回答者尽量用sed处理
只要处理的效率高,也可考虑用sed+for+其他,总之外部工具就只提供sed)------OS: windows NT系列
目的------就是为了大家很好地学习sed,带着问题学,这从实践中学习

我也在学,以前总是半途而废,这个帖子发了,就真正从这里开始sed的学习旅程了,希望有你同行。。。。

1,输出文本时(这5个字在以后省略)怎样显示一个文本的前10行?最后1行?
::显示文本前10行
sed 11,$d a.txt
::显示文本最后一行
sed -n $p a.txt
::显示文本最后一行
sed $!d a.txt
解释:$表示....d,p表示,-n参数....举个例子.....

2,将文本的“;”“,”作为换行符其他字符不变?
sed s/;/\n/g a.txt
解释:......

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

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

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

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

7,怎么显示纯英文行,中文行?中英文混合行?

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

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

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

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


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

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

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

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

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

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

18,显示所有重复行

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

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

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的第二行后面,以此类推。。。
.....

问题还多者呢,先问这些,
大家能想到什么文本处理的问题就发,然后我来回答。我不会了大家回答,

大家在回答时,最好能附上一定的解释,如果自己对所用的参数比较了解,能讲解就更好了,一来方便其他人学习,二来时间长了,自己下次浏览此贴时也是个参考(只是建议,仅此)


好了,征集答案。。。

[ Last edited by plp626 on 2008-6-3 at 07:57 AM ]
作者: plp626     时间: 2008-5-31 04:29
sed工具,各类帮助文档下载:
http://upload.cn-dos.net/img/498.rar

我就收集了这些:
    kongge.txt
    sed1line.txt
    sed.exe
    sed.pdf
    sed_readme.txt
    SED单行脚本快速参考.txt
作者: HAT     时间: 2008-5-31 10:01
3,显示文本第20行到25行之间的内容?
sed -n "20,25p" a.txt

作者: HAT     时间: 2008-5-31 10:19
4,显示文本的奇数行?偶数行?
sed -n "p;n"  a.txt

sed -n "n;p"  a.txt

作者: HAT     时间: 2008-5-31 10:24
5,在文本里包含"爱你"的字符换成”【爱你】“,包含“恨你”的字符换成"(恨你)"输出?
sed -e "s/爱你/【爱你】/g" -e "s/恨你/(恨你)/g" a.txt

作者: HAT     时间: 2008-5-31 10:28
6,将文本里的这些字符%:^?<>*/\|&全部替换为空格?
sed "s/[%:^?<>*/\|&]/ /g" a.txt

作者: HAT     时间: 2008-5-31 13:15
10,将每一行首、尾、的所有空格删除?
sed "s/^ *//;s/ *$//" a.txt

作者: HAT     时间: 2008-5-31 13:16
11,给每一行的开头加上"echo"?
sed "s/^/echo/" a.txt

作者: HAT     时间: 2008-5-31 13:18
12,如果某行的行尾是以"。"结尾,就删除"。"
sed "s/。$//" a.txt

作者: joyn     时间: 2008-5-31 13:18
外部命令......
作者: radem     时间: 2008-5-31 18:15
下来学习。。。
作者: vkill     时间: 2008-5-31 19:38
10,将每一行首、尾、的所有空格删除?
sed "s/^[/t]*//;s/[/t]*$//;s/ //g" file

作者: terse     时间: 2008-5-31 21:24
sed命令好难懂
如果某行的行尾是以"。"结尾,就删除"。"
sed "s/。\t*$//"
删正行
sed  "/。$/d"

作者: slore     时间: 2008-5-31 22:11
VBS...飘过……


9.  替换 回车+我,我
作者: pooronce     时间: 2008-5-31 22:15
13
sed -e "s/\(..........\).*/\1/" if.txt
sed不支持大括号确定字符数,所以只好用10个点来代表10个字符了,用\( \)括起来自动编号为第一组,也就是说把10个字符后面的都清空了。

[ Last edited by pooronce on 2008-6-1 at 09:11 PM ]
作者: 26933062     时间: 2008-5-31 22:40

:: 12,如果某行的行尾是以"。"结尾,就删除"。"
sed -e "s/。$//" a.txt | more

:: 13,如果某行多于10个字符,只显示每一行的前10个字符
sed -n "/........../{s/\(..........\).*/\1/p}" a.txt | more

作者: 26933062     时间: 2008-5-31 22:44
晕 13 题跑题了,
变成了 匹配10个字符以上的行,并只显示前10个字符
sed -n "/........../{s/\(..........\).*/\1/p}" a.txt | more
作者: pooronce     时间: 2008-5-31 23:27
全部看了一遍:
1
sed -n -e "1,10p;$p" file
::1        用-n禁止输出,这样打印1到10和末行

2
sed -e "s/;/\n/g;s/,/\n/g;" file
::2        简单替换

3
sed -e "20,25!d" file
::3        同你第一个,20到25不清空

4
sed -e "s/.*//g;N;" file
::清空ps并读入下一行,偶行输出
sed -e "1!{s/.*//g;N}" file
::同上,只是跳过第一行,奇行输出

(想下面时出了好点的解决方法:
sed -e "p;N;d" file
::直接打印一行,多读一行,删,奇行输出
sed -e "1d;p;N;d" file
::偶行输出,每一行直接删掉
)


5、
简单替换,不重复了

6、
仍是简单替换,不说了,只是注意转义

7、
这个有点难度,目前还不知道怎么在正则里面表达汉字,同求解

8、
sed -e "N;s/\n//" file
::N读取下一行,替换掉换行符

9、
sed -e "1{x;d};${x;p;x;b};/^5/{x;G;s/\n//;x;b};x" file
::暂时用5代表“我”,用中文的总是不正常,原因未明,期待答案

10
sed -e "s/^\s*//;s/\s*$//;" file
::\s代表空字符,一般是空格和TAB

11、12略

作者: zhengruijian     时间: 2008-5-31 23:34
太好了.
我来说一个.
前提是对一个文件夹下的N个TXT文件进行处理,对每一个TXT里的每一行前面都加入000
作者: zhengruijian     时间: 2008-5-31 23:43
如何把下面这段字符加入到某个文件夹下的N多个文件的第一行前面,之后回车.保存.
  [ar:LIYANG]
  [ti:CrazyEnglish]
  [al:CrazyEnglish]
  [by:me]
  [00:00.00]
作者: 26933062     时间: 2008-5-31 23:45
显示纯英文行
sed -n "/^[a-z A-Z]*$/p" a.txt
作者: HAT     时间: 2008-6-1 01:34
13,如果某行多于10个字符,只显示每一行的前10个字符

我知道这样可以查找出多余10个字符的行,但是不知道怎样只显示前10个字符。
sed -n "/^.\{10\}/p" a.txt
如果再去调用除sed之外的其它命令的话,不知道是否会违背楼主的要求。
作者: bat-zw     时间: 2008-6-1 01:43
&&哈哈,论坛掀起了sed热了,这是好事,我精神上绝对支持!
    本人只用纯批,正在考虑学习vbs,原因在任一台电脑上都能操作,而不用人为添
加任何程序和第三方工具,一个字简单的好!
作者: HAT     时间: 2008-6-1 01:57
8,将奇偶行拼接成一行,比如12行合并,34行合并....?

在Unix下是很容易实现的:
sed '$!N;s/\n/ /' a.txt
但在cmd下调用sed.exe的话,这样做是不行的,不知楼主有何高招?
作者: hyu029     时间: 2008-6-1 01:58
近来学写了
作者: HAT     时间: 2008-6-1 02:04


  Quote:
Originally posted by 26933062 at 2008-5-31 11:45 PM:
显示纯英文行
sed -n "/^[a-z A-Z]*$/p" a.txt

这个正则表达式写的很正确,在Unix下可以得到正确结果,但是在cmd下调用sed.exe却得不到任何结果。

  Quote:
C:\test>type a.txt
abc
a啊

啊a

ccc

C:\test>sed -n "/^[a-z A-Z]*$/p" a.txt

C:\test>


作者: HAT     时间: 2008-6-1 02:06


  Quote:
Originally posted by zhengruijian at 2008-5-31 11:34 PM:
太好了.
我来说一个.
前提是对一个文件夹下的N个TXT文件进行处理,对每一个TXT里的每一行前面都加入000


sed "s/^/000/" *.txt

作者: HAT     时间: 2008-6-1 17:51
15,倒置所有行,第一行成为最后一行,依次类推.....
sed -n "1!G;h;$p" a.txt

作者: terse     时间: 2008-6-1 17:57
每行第一个字成为最后一字 没招了 我估计我学不会这个SED 参数看到我头大
sed "/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//" test.txt

[ Last edited by terse on 2008-6-1 at 05:58 PM ]
作者: HAT     时间: 2008-6-1 18:02
17,在每5行后增加一空白行
sed "n;n;n;n;G;" a.txt

作者: sylovanas     时间: 2008-6-2 21:34


  Quote:
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

可以用
作者: sylovanas     时间: 2008-6-2 21:41
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
作者: plp626     时间: 2008-6-3 07:11


  Quote:
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

作者: HAT     时间: 2008-6-3 09:31


  Quote:
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

可以用

楼主的要求是获取纯英文的行,加上那个点以后,就无法得到正确结果了。
作者: HAT     时间: 2008-6-3 09:33


  Quote:
Originally posted by plp626 at 2008-6-3 07:11 AM:

多了一个点:
sed -n "/^[a-z A-Z]*$/p" a.txt

不加那个点也不对,见26楼描述。
作者: pooronce     时间: 2008-6-3 10:09


  Quote:
Originally posted by HAT at 2008-6-3 09:33 AM:

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

不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:
sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file

作者: pooronce     时间: 2008-6-3 10:22
简单测试了一下,发现-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

作者: pooronce     时间: 2008-6-3 10:26
btw:说明一下,以免还不熟的朋友搞混了:
* 代表匹配前面的字符任意次,所以包括0次
+ 代表匹配1次以上

另外还有
? 代表0或1次

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

另,论坛有shell标准用吗?就是引用一块黑的类DOS显示块来。
作者: HAT     时间: 2008-6-3 11:45


  Quote:
Originally posted by pooronce at 2008-6-3 10:09 AM:


不加那个点的话,会匹配到空行,正确的应该是重复一次,这样:
sed -e "/^[a-zA-Z][a-zA-Z]*$/!d" file

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

  Quote:
abc
a啊

啊a


作者: pooronce     时间: 2008-6-3 11:48


  Quote:
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.

作者: HAT     时间: 2008-6-3 12:07
可能是我的sed版本太低吧, 我去找个高版本的试试。

  Quote:
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.


作者: 26933062     时间: 2008-6-8 21:08
[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

作者: ngd     时间: 2008-6-19 13:59
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)字元。

作者: HAT     时间: 2008-6-19 18:26
21,分割文本,将其1到100行保存为a_1.txt,101-200行保存为a_2.txt,以此类推...
split -100 a.txt
用split比较简单,有必要的话再修改一下分割后的文件名就行了。
作者: HAT     时间: 2008-6-21 04:41


  Quote:
Originally posted by ngd at 2008-6-19 01:59 PM:
9,如果当前行是以"我"字开头,怎么将它合并到上一行?
sed ":a;$!N;s/\n我/我/;ta;P;D" a.txt

我来试着解释一下吧,如果不当之处,望大家指正。
假设a.txt内容如下:

  Quote:
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: 蓝色字符表示模式空间的内容
作者: 7testing     时间: 2010-5-26 13:39
sed工具在哪儿能下载得到呢?