Board logo

标题: [文本处理] [已解决]批处理如何实现对字符串连接、替换及删除功能? [打印本页]

作者: xlkindy    时间: 2010-3-18 14:56     标题: [已解决]批处理如何实现对字符串连接、替换及删除功能?

例如有文本文件中内容如下:
字符串1;
字符串2;
字符串3;
字符串4;
字符串5;
字符串6;

希望通过批处理实现将该内容改成:
字符串1;字符串2
字符串3;字符串4
字符串5;字符串6
即从第二行的字符串起,将该字符串连接到其上一行后面,并删除其末尾原有的“;”号,并将其下一行上移一行,以此类推。
另:可以不使用中间文件来实现吗?

[ 本帖最后由 xlkindy 于 2010-3-18 17:29 编辑 ]
作者: BatCoder    时间: 2010-3-18 15:26

  1. sed -i "$!N;s/\n//;s/;$//" a.txt
复制代码

作者: xlkindy    时间: 2010-3-18 15:39

谢谢楼上~
用sed是可以实现。
有无不使用sed,而直接使用for来实现的方法?
作者: BatCoder    时间: 2010-3-18 15:43

“不使用中间文件”是指直接对原文件进行修改,不生成任何新的文件吗?
作者: xlkindy    时间: 2010-3-18 15:44

对,就是指在更改文本内容的过程中不产生任何的临时文件,直接在目标文本文件中进行调整。
作者: xlkindy    时间: 2010-3-18 15:49

另外,对于原始文件的内容,如果希望进行下面的改变,该如何实现:
字符串1;字符串2
字符串2;字符串3
字符串3;字符串4
字符串4;字符串5

用sed或用for都可以。
作者: BatCoder    时间: 2010-3-18 15:50

非常遗憾,没有哪个命令可以直接更改原始文件,都是通过临时文件来实现的,sed也不例外。
作者: xlkindy    时间: 2010-3-18 15:53

嗯。我也自己做了几次尝试,确实如此。
那请教一下,像上面提到的第二种调整方式,如果用sed的话该如何实现呢?
作者: FOR    时间: 2010-3-18 17:23

直接修改源文件,注意备份。
未考虑文件内容含!符号的情况。
  1. @echo off&set /a flag=0,n=0
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (a.txt) do (
  4.    set /a n+=1
  5.    set num=!num!%%i
  6.    if !n! equ 2 (
  7.       set /a n=0
  8.   if !flag! equ 0 (
  9.      set flag=2
  10. >a.txt echo !num:~0,-1!
  11.    ) else (>>a.txt echo !num:~0,-1!)
  12. set "num="
  13. )
  14. )
  15. start a.txt
复制代码
第二个问题
  1. @echo off&set /a flag=0,n=0
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (a.txt) do (
  4.    set /a n+=1
  5.    set num=!num!%%i
  6.    if !n! equ 2 (
  7.       set /a n=1
  8.   if !flag! equ 0 (
  9.      set flag=2
  10. >a.txt echo !num:~0,-1!
  11.    ) else (>>a.txt echo !num:~0,-1!)
  12. set "num=%%i"
  13. )
  14. )
  15. start a.txt
复制代码

作者: xlkindy    时间: 2010-3-18 17:28

多谢指教,受益多多~!
作者: BatCoder    时间: 2010-3-18 17:44

这个所谓“直接修改源文件”的方案存在重大bug,建议谨慎使用,以免造成不必要的数据损失。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2