标题: [已解决]sed提取文本指定行数提示出错 [打印本页]
作者: BillGates 时间: 2015-11-21 19:13 标题: [已解决]sed提取文本指定行数提示出错
本帖最后由 BillGates 于 2015-11-21 20:26 编辑
现在有1000+个TXT文档,想用sed提取每个文档的前3行,本来应该很容易的,但是不知道为什么sed总是报错。
我的代码如下:- @echo off
- for /r %%a in (*.txt) do (
- sed -n 1,3p %%a>>all.txt
- )
- pause
复制代码
错误的提示如下:sed: couldn't write 46 items to stdout: No space left on device
后来测试了一下,好像首行怎么样都提取不了,只能从第二行开始,下面的代码就正常了- @echo off
- for /r %%a in (*.txt) do (
- sed -n 2,3p %%a>>all.txt
- )
- pause
复制代码
我用的是win10 专业版,不知道是不是系统原因呢,求各位大大解答
结果:在变量名那里加个双引号解决了。
作者: 依山居 时间: 2015-11-21 19:47
可能有特殊字符。变量加引号测试一下。
sed -n 2,3p “%%a”>>all.txt
作者: hlzj88 时间: 2015-11-21 19:48
sed -n '2,3p' 1.txt>>2.txt
我也是今天刚看sed,,帮助里是这样的
也许是你的没加 单引号
作者: BillGates 时间: 2015-11-21 20:23
回复 3# hlzj88
2,3那个可以正常运行的,1,3p不行,加了引号也不行
作者: BillGates 时间: 2015-11-21 20:25
回复 2# 依山居
原来如此,它处理带符号的要这样处理啊,折腾了半天呢!谢谢!它还有没有一些要注意的地方啊大大。
作者: 依山居 时间: 2015-11-21 20:58
回复 5# BillGates
虽然我并不会sed,我还让你自己找资料自己看。。另外不乱用大大之类称呼人好吧。
作者: 依山居 时间: 2015-11-21 21:02
回复 5# BillGates
并不是SED要这样。而是批处理需要这样。
作者: DAIC 时间: 2015-11-21 22:12
回复 3# hlzj88
你看的帮助是按照Linux写的,Windows里面需要双引号。
作者: 依山居 时间: 2015-11-21 22:26
回复 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
本帖最后由 依山居 于 2015-11-21 22:53 编辑
原因估计找到了。
t.txt转为UTF8 无BOM就解决了。
UTF8的标记导致其它命令工具输出也显示乱码了。
作者: 依山居 时间: 2015-11-21 22:45
- o( ̄▽ ̄)o 2015/11/21 周六22:43:30.09 <( ̄︶ ̄)>
- c:\>sed -n 1p t.txt
- fj
复制代码
作者: 依山居 时间: 2015-11-21 22:55
本帖最后由 依山居 于 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参数- o( ̄▽ ̄)o 2015/11/21 周六22:57:19.94 <( ̄︶ ̄)>
- c:\>sed -n 1p t.txt
- sed: couldn't write 5 items to stdout: No space left on device
-
- o( ̄▽ ̄)o 2015/11/21 周六22:57:27.02 <( ̄︶ ̄)>
- c:\>sed -e "1s/^\xef\xbb\xbf//" t.txt
- fj
- a
- b
- d
-
-
- o( ̄▽ ̄)o 2015/11/21 周六22:57:47.87 <( ̄︶ ̄)>
- c:\>sed -i "1s/^\xef\xbb\xbf//" t.txt
-
- o( ̄▽ ̄)o 2015/11/21 周六22:58:00.97 <( ̄︶ ̄)>
- c:\>sed -n 1p t.txt
- fj
复制代码
作者: CrLf 时间: 2015-11-22 10:50
用 more/find/findstr 等命令过渡一下
作者: 依山居 时间: 2015-11-22 12:19
回复 13# CrLf
思路赞,但是效率变太低了哦。
作者: DAIC 时间: 2015-11-22 15:15
回复 9# 依山居
c:\Test>sed -n "1p" 1.txt
a
c:\Test>sed --version
sed (GNU sed) 4.2.2
Win7 x64 无法重现你的问题
作者: 依山居 时间: 2015-11-22 15:32
回复 15# DAIC - C:\Users\xx\Desktop>sed --version
- sed (GNU sed) 4.2.2
复制代码
反复测试过的。也是W7 X64。使用notepad++ 转为utf 8格式。- sed: couldn't write 7 items to stdout: No space left on device
复制代码
转为无BOM格式就正常。
作者: DAIC 时间: 2015-11-22 21:05
回复 16# 依山居 复制代码
很久之前有人给出过这样的方案解决你那个报错,试试吧。
作者: 依山居 时间: 2015-11-22 21:11
回复 17# DAIC
但是fj 变成乱码了。- C:\>sed -n "1p" t.txt > con
- 锘縡j
复制代码
另,我前面已经贴了我找到解决方案了。就是sed 去掉BOM头部。
作者: DAIC 时间: 2015-11-22 21:23
回复 18# 依山居
你处理的文件不是ANSI编码?忽略我吧
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |