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

[已解决]sed提取文本指定行数提示出错

[复制链接]
发表于 2015-11-21 19:13:32 | 显示全部楼层 |阅读模式
本帖最后由 BillGates 于 2015-11-21 20:26 编辑

现在有1000+个TXT文档,想用sed提取每个文档的前3行,本来应该很容易的,但是不知道为什么sed总是报错。
我的代码如下:
  1. @echo off
  2. for /r %%a in (*.txt) do (
  3. sed -n 1,3p %%a>>all.txt
  4. )
  5. pause
复制代码
错误的提示如下:sed: couldn't write 46 items to stdout: No space left on device
后来测试了一下,好像首行怎么样都提取不了,只能从第二行开始,下面的代码就正常了
  1. @echo off
  2. for /r %%a in (*.txt) do (
  3. sed -n 2,3p %%a>>all.txt
  4. )
  5. pause
复制代码
我用的是win10 专业版,不知道是不是系统原因呢,求各位大大解答

结果:在变量名那里加个双引号解决了。
发表于 2015-11-21 19:47:06 | 显示全部楼层
可能有特殊字符。变量加引号测试一下。
sed -n 2,3p “%%a”>>all.txt
发表于 2015-11-21 19:48:17 | 显示全部楼层
sed -n '2,3p' 1.txt>>2.txt
我也是今天刚看sed,,帮助里是这样的
也许是你的没加  单引号
 楼主| 发表于 2015-11-21 20:23:14 | 显示全部楼层
回复 3# hlzj88
2,3那个可以正常运行的,1,3p不行,加了引号也不行
 楼主| 发表于 2015-11-21 20:25:57 | 显示全部楼层
回复 2# 依山居
原来如此,它处理带符号的要这样处理啊,折腾了半天呢!谢谢!它还有没有一些要注意的地方啊大大。
发表于 2015-11-21 20:58:40 | 显示全部楼层
回复 5# BillGates


  虽然我并不会sed,我还让你自己找资料自己看。。另外不乱用大大之类称呼人好吧。
发表于 2015-11-21 21:02:49 | 显示全部楼层
回复 5# BillGates


    并不是SED要这样。而是批处理需要这样。
发表于 2015-11-21 22:12:27 | 显示全部楼层
回复 3# hlzj88


    你看的帮助是按照Linux写的,Windows里面需要双引号。
发表于 2015-11-21 22:26:05 | 显示全部楼层
回复 8# DAIC


c:\>sed -n 1p t.txt
sed: couldn't write 5 items to stdout: No space left on device


c:\>sed -n 2p t.txt
a


c:\>sed -n "1p" t.txt
sed: couldn't write 5 items to stdout: No space left on device

不能输出第一行是什么问题呢?
发表于 2015-11-21 22:45:22 | 显示全部楼层
本帖最后由 依山居 于 2015-11-21 22:53 编辑

原因估计找到了。

t.txt转为UTF8 无BOM就解决了。
UTF8的标记导致其它命令工具输出也显示乱码了。
发表于 2015-11-21 22:45:38 | 显示全部楼层
  1. o( ̄▽ ̄)o 2015/11/21 周六22:43:30.09 <( ̄︶ ̄)>
  2. c:\>sed -n 1p t.txt
  3. fj
复制代码
发表于 2015-11-21 22:55:06 | 显示全部楼层
本帖最后由 依山居 于 2015-11-21 23:01 编辑

How to remove BOM from UTF-8 using sed? http://www.linuxask.com/question ... rom-utf-8-using-sed
楼主主可以考虑直接把需要处理的文件转成UTF8无BOM
加-i参数

  1. o( ̄▽ ̄)o 2015/11/21 周六22:57:19.94 <( ̄︶ ̄)>
  2. c:\>sed -n 1p t.txt
  3. sed: couldn't write 5 items to stdout: No space left on device

  4. o( ̄▽ ̄)o 2015/11/21 周六22:57:27.02 <( ̄︶ ̄)>
  5. c:\>sed -e "1s/^\xef\xbb\xbf//" t.txt
  6. fj
  7. a
  8. b
  9. d


  10. o( ̄▽ ̄)o 2015/11/21 周六22:57:47.87 <( ̄︶ ̄)>
  11. c:\>sed -i "1s/^\xef\xbb\xbf//" t.txt

  12. o( ̄▽ ̄)o 2015/11/21 周六22:58:00.97 <( ̄︶ ̄)>
  13. c:\>sed -n 1p t.txt
  14. fj
复制代码
发表于 2015-11-22 10:50:51 | 显示全部楼层
用 more/find/findstr 等命令过渡一下
发表于 2015-11-22 12:19:30 | 显示全部楼层
回复 13# CrLf


    思路赞,但是效率变太低了哦。
发表于 2015-11-22 15:15:21 | 显示全部楼层
回复 9# 依山居


c:\Test>sed -n "1p" 1.txt
a

c:\Test>sed --version
sed (GNU sed) 4.2.2

Win7 x64 无法重现你的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:24 , Processed in 0.021575 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表