中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-06 16:52
48,039 主题排行 / 350,124 发帖 / 今日 0 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » 如何用批实现TXT文本的某两行互换?
可打印版本  4,771 / 24
第1楼 lotus516 发表于 2006-11-06 03:07
高级用户 发帖 246 积分 551
如何用批实现TXT文本的某两行互换?
我有一个文本,里面内容如下:
张三
李四
王二麻子
小白
小黑
小强
...... rem:中间为N行
小二
赵大
QQ
DOS
WIN98
WINXP
现在我想实现把WINXP和张三互换成如下文本:(即文本第一行和最后一行互换)
WINXP
李四
王二麻子
小白
小黑
小强
...... rem:中间为N行
小二
赵大
QQ
DOS
WIN98
张三
第2楼 redtek 发表于 2006-11-06 05:48
金牌会员 发帖 1,147 积分 2,902
只按楼主给出的原始模型处理,
以下代码只考虑到楼主上面非真实模型上的要求,
不考虑楼主没有给出的特殊情况或特殊符号等问题~:)





使用说明: 如果未加参数则提示使用说明信息。



原理: 大老婆和二老婆想互相交换她们手中的礼物,
    于是大老婆先把礼物暂存在我这里,手腾空了后把二老婆的礼物拿了过去。
    二老婆的礼物交给了大老婆以后,手腾空了。这时我再把大老婆暂存在我手中的礼物交给二老婆。
    于是她们双方都互换了礼物~:)


[备注:] 指定生成的新文件如果是已存在的文件,它将自动无提示删除。

[ Last edited by redtek on 2006-11-6 at 05:50 AM ]
第3楼 namejm 发表于 2006-11-06 05:55
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  假设你要处理的test.txt文本中没有CMD下的敏感字符(如<、>、|等),首行不为空,并且没有内容重复的行,那么,用下面的代码基本能满足你的需求:


[ Last edited by namejm on 2006-11-6 at 02:03 PM ]
第4楼 redtek 发表于 2006-11-06 05:56
金牌会员 发帖 1,147 积分 2,902
本来应该为方便楼主应用,
例如:想让第3行与倒数第3行交换,则

   Swap.BAT swap.dat 3 -3 a.txt
 或 Swap.BAT swap.dat 3 a.txt

如果能这样会更方便楼主,实在是力不从心,谅~~
第5楼 namejm 发表于 2006-11-06 07:06
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  在3F的基础上得到如下代码,可以处理内容有重复的行。原理和3F近似,只是过滤的不再是行内容,而是过滤行号:
第6楼 vkill 发表于 2006-11-06 07:31
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
sed -n "$p" >temp.txt
sed "1{d;p}" test.txt |sed "${d;p}" >>temp.txt
sed -n "1p" >>temp.txt

未测试,原理上可行
第7楼 lotus516 发表于 2006-11-06 11:59
高级用户 发帖 246 积分 551
谢谢,不过namejm,3楼的命令不成功!!!
第8楼 namejm 发表于 2006-11-06 12:33
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  3F的代码有诸多限制,如果我说漏了某些情况,能否把你的txt内容贴一部分出来?
第9楼 lotus516 发表于 2006-11-07 01:48
高级用户 发帖 246 积分 551
好,详细见附件

附件
1.txt (2.39 KiB)
第10楼 namejm 发表于 2006-11-07 01:59
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  不好意思,发帖子的时候,copy了修改前的代码,而没有帖出修正后的内容,导致3F的代码漏掉了写入首行和尾行的语句,现已修正,请再次测试。
第11楼 vkill 发表于 2006-11-07 09:07
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
test.bat
@echo off
::%1为life,调换%2和%3
::比如说在test.txt中调换1行和9行,使用方法test.bat test.txt,1,9
::暂时不能换3,-3之类的,不过可以sed -n "$=" %1 来看总共有多少行~再set/a计算实际的+行数

if *%1==* (echo 未指定文件&pause>nul&goto :eof)
if *%2==* (set s=1) else (set s=%2)
if *%3==* (set e=$) else (set e=%3)
if not "%e%"=="$" if %e% lss %s% (set "s=%3"&set "e=%2")

for /f "tokens=*" %%? in ('sed -n "%e%p" %1') do (
sed -e "%s%h" -e "%e%x" %1|sed "%s% c\%%?" |more>temp.txt
)
pause
exit



测试test.txt
`-=\;',./~!@#o^&*()_+{}|:"<>?
ab
AB
12 34
一二三四五六七八九○
!·¥……—()——:“?》《
http ://abc.abc.abc/

[ Last edited by vkill on 2006-11-7 at 09:55 AM ]
第12楼 namejm 发表于 2006-11-07 09:23
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  网吧里的系统一般都是被阉割过的,有安全问题的命令可能都被废了。
第13楼 vkill 发表于 2006-11-07 09:31
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
Originally posted by namejm at 2006-11-7 09:23:
  网吧里的系统一般都是被阉割过的,有安全问题的命令可能都被废了。

namejm兄测试下,原理是先把9替换为1,再把1复制为原文件9的内容~

11 F代码更新

[ Last edited by vkill on 2006-11-7 at 09:58 AM ]
第14楼 namejm 发表于 2006-11-07 10:24
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  居然没有保存 sed 程序,我知道无奈何兄最近刚发过,但一时也搜索不到它的下载,汗~~,能给个下载的地址吗?
第15楼 无奈何 发表于 2006-11-07 11:09
荣誉版主 发帖 356 积分 1,338
我也补个 sed 的,文件不要过于巨大。



sed 下载:http://www.student.northpark.edu/pemente/sed/gsed407x.zip
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023