[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

[ 本帖最后由 xlkindy 于 2010-3-18 17:29 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

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

TOP

谢谢楼上~
用sed是可以实现。
有无不使用sed,而直接使用for来实现的方法?

TOP

“不使用中间文件”是指直接对原文件进行修改,不生成任何新的文件吗?
Do All in Command Line

TOP

对,就是指在更改文本内容的过程中不产生任何的临时文件,直接在目标文本文件中进行调整。

TOP

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

用sed或用for都可以。

TOP

非常遗憾,没有哪个命令可以直接更改原始文件,都是通过临时文件来实现的,sed也不例外。
Do All in Command Line

TOP

嗯。我也自己做了几次尝试,确实如此。
那请教一下,像上面提到的第二种调整方式,如果用sed的话该如何实现呢?

TOP

直接修改源文件,注意备份。
未考虑文件内容含!符号的情况。
  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
复制代码
1

评分人数

TOP

多谢指教,受益多多~!

TOP

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

TOP

返回列表