Board logo

标题: 怎么删除文本的最后一行 [打印本页]

作者: scriptor     时间: 2007-2-26 09:07    标题: 怎么删除文本的最后一行

如题
作者: vkill     时间: 2007-2-26 09:49
去看sed好了
作者: scriptor     时间: 2007-2-26 09:58
又是sed第三方tool

能不能不用sed第三方tool?
作者: zh159     时间: 2007-2-26 10:08

setlocal EnableDelayedExpansion
cd.>new.txt
for /f "delims=" %%i in (old.txt) do set /a line+=1
for /f "delims=" %%i in (old.txt) do (
  set /a n+=1
  if not "!N!" == "!line!" >>new.txt echo %%i
)
PS:未测试,不包含空行
作者: scriptor     时间: 2007-2-26 10:21


  Quote:
Originally posted by zh159 at 2007-2-25 21:08:
[code]setlocal EnableDelayedExpansion
cd.>new.txt
for /f "delims=" %%i in (old.txt) do set /a line+=1
for /f "delims=" %%i in (old.txt) do (
  set /a n+=1
  if not " ...

最后一行还是没有被删掉
作者: zh159     时间: 2007-2-26 11:27
除非你说的生成的最后一行是空行
作者: scriptor     时间: 2007-2-26 11:59
6楼

我错了
可以删除。
但是文本的中间有空行,没有输出来
作者: 1112yuhua     时间: 2007-8-7 14:14
findstr $ a.txt >>b.txt
作者: 26933062     时间: 2007-8-7 15:23

@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /n .* a.txt') do set var=%%i
for /f "tokens=1* delims=:" %%i in ('findstr /n .* a.txt') do (
if "%%i"=="%var%" (exit) else echo.%%j
)
pause

作者: ccwan     时间: 2007-8-7 15:48
8楼的方法好。
作者: zqdarkday     时间: 2007-8-7 21:21
我觉得用VBS好啊
脚本中心好象有个帖子就是关于文本最后一行的。
http://www.microsoft.com/china/t ... rces/hey060303.mspx
就在这上面,其实我的VBS也没学好,只能提供资料了。
呵呵,希望大家也多多讨论下VBS。
作者: ccwan     时间: 2007-8-8 08:04
re zqdarkday
那个帖子是讨论怎么读取最后一行的,不是这里讨论的问题。
事实上,没有什么东西一定比什么东西好这样的说法,这是要看特定的条件的。
就拿本例来说,8楼的代码无疑是最优的方法,vbs做不到如此简洁。
作者: ansipeter     时间: 2007-8-8 09:49
8楼的方法的确很好,不过最后一行不能回车,如果回车了则无效
作者: zqdarkday     时间: 2007-8-8 11:05
re ccwan兄
其实我不是觉得vbs就比批处理好,我知道那个帖子上是如何读取最后一行,但是改一
下就可以了
8楼的方法是不错的拉,这点我同意,要我编是编不出来他那样的
但是我还是觉得大家讨论的时候可以从别的方面想一下,比如VBS,JAVAS,这样从不同的地方入手会有其他的收获呢,你说呢。
其实我的VBS也学得不好,我也想从集体的智慧中收获点我要的东西嘛。呵呵。
作者: terse     时间: 2007-8-8 13:10
@echo off&setlocal enabledelayedexpansion
cd.>test2.txt
for /f "delims=" %%i in ('findstr /n . test.txt') do set /a n=%%i-1 2>nul
     for /f "delims=" %%a in ('findstr /n .* test.txt') do (
        set /a mn=%%a-1 2>nul
        set "m=%%a"
        set "m=!m:*:=!"
if !mn! EQU !n! goto end
echo.!m!>>test2.txt
  )
)
:end
pause
作者: 26933062     时间: 2007-8-8 17:29
8楼的方法确实好,如此简洁..
就是不太理解 findstr 命令的表达式
$ 不是代表行尾吗?那么 findstr $  应该是匹配最后一行啊?怎么会是忽略最后一行呢?
不解,望高人指点.
作者: ansipeter     时间: 2007-8-8 17:32
他的findstr $ a.txt的意思不就是查找有结束符的行吗?你最后一行只要不按回车不就排除了吗?哎
作者: namejm     时间: 2007-8-9 10:14
  17楼的解释并没有错,MS对findstr $ 的解释是匹配行尾,实际上,查找的是一行的回车换行符号,这也是使用 findstr ^.*$ 做整行匹配时必须注意的一个问题,稍微不细心就要出错。比如,findstr ^abc$ test.txt 的本意是要查找 abc 这个字符串行,如果 abc 这个字符串行正好位于最后一行的话,就无法匹配到,解决的办法是强制在 test.txt 的最后一行后添加新行,比如说一个空行。
作者: ansipeter     时间: 2007-8-9 11:29
知道为什么他这么回答吗?因为我还是个新手,还是个初级用户,如果我是版主,他的回答就会变成“有些不理解,请版主明示”,哎,对于所谓的高级用户我的任何解释都是无效的,要不我说论坛变得越来越拉圾啦,论坛今后的发展令人担忧啊.........

对了,namejm最近学习WMIC怎么样?入门没有?

[ Last edited by ansipeter on 2007-8-9 at 11:32 AM ]
作者: namejm     时间: 2007-8-9 12:18
  其实,考虑问题需要多转几道弯,虽然别人没有把你想要的答案直接说出来,但是,别人说到了点子上,并没有展开来,这个时候,你就得再做一些推论。

  就你的疑问,解释如下:
  1、因为 findstr $ 的实质是查找行尾的回车换行符号,又因为除了最后一行之外的所有行的行尾都存在这个符号,所以,最后一行之外的所有行都能够查找到;
  2、因为最后一行虽然看起来是完整的一行,但是,它的尾部并没有回车换行符号,而 findstr $ 是以回车换行符号来识别某个字符串是不是一个"行",所以,最后一行不能被识别;
  3、综上所述,findstr $ 只能找到除了最后一行之外的其它行(除了以分号打头的行——注:这个是有条件限制的,如24楼所说的条件),最后一行因为行尾没有回车换行符号而被 findstr $ 忽略了,也就达到了删除最后一行的目的。

[ Last edited by namejm on 2007-8-9 at 02:52 PM ]
作者: 26933062     时间: 2007-8-9 14:16
茅塞顿开!
findstr 的表达式是有很多不太好理解啊.
再请问一句,  (除了以分号打头的行)  是什么意识?
我试了一下,分号打头的行也可以匹配啊?
谢了.

[ Last edited by 26933062 on 2007-8-11 at 07:32 AM ]
作者: namejm     时间: 2007-8-9 14:50
  呵呵,findstr $ 不能查找以分号打头的行,这个是有条件限制的,我忘记说了,是在这样的语句中是不能查找的:for /f "delims=" %%i in ('findstr $ test.txt') ……
作者: kingyn     时间: 2007-8-27 19:41
哇,热处理这么复杂呀,让我越学越觉累
作者: lhkyzh     时间: 2008-1-22 23:09
那么删除最后两行的语句应该怎么写呢?
findstr $ a.txt >>b.txt是很精简,但是不能删除空行。