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

[文本处理] [已解决]求助批处理替换文本

本帖最后由 hnfeng 于 2023-4-23 16:47 编辑

一文本文件里有如下的内容:
  1. 文字文字文字文字文字文字文字文字文字文字文字
  2. 文字文字文字文字文字文字文字文字
  3.    文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  4.           文字文字文字文字文字文字文字文字
  5. 文字文字文字文字文字文字
  6.       文字文字文字文字文字文字文字文字文字
复制代码
想用批处理或第三方程序替换为:
  1. "文字文字文字文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
  2. "文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
  3. "   文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字" & @CRLF & _
  4. "          文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
  5. "文字文字文字文字文字文字" & @CRLF & _
  6. "      文字文字文字文字文字文字文字文字文字" & @CRLF
复制代码
即:1、先把连续两个回车换行 \r\n\r\n 替换为 & @CRLF & @CRLF & _,当然文字部分要用双引号括起来
     2、再替换 前面不是 _ 的单个回车换行 \r\n 替换为 & @CRLF & _,文字部分也要用双引号括起来
不熟悉正则,研究的头晕也没搞出来,只好想高手求助了,先谢谢了
1

评分人数

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

好像用cmd也能处理这个问题:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=:" %%i in ('findstr /n .* 1.txt') do (
  4.     if "%%j"=="" (
  5.         echo,!str! ^& @CRLF ^& @CRLF ^& _
  6.         set str=
  7.     ) else (
  8.         if defined str echo, !str! ^& @CRLF ^& _
  9.         set "str=%%j"
  10.     )
  11. )
  12. if defined str echo, !str! ^& @CRLF ^& _
  13. pause
复制代码

TOP

回复  hnfeng

命令行与批处理对于百分号(%)的表述有差异,8楼的指令只能用于命令行方式执行,以下指令 ...
hfxiang 发表于 2023-4-23 10:26



    原来如此,谢谢

TOP

回复 10# hnfeng

命令行与批处理对于百分号(%)的表述有差异,8楼的指令只能用于命令行方式执行,以下指令需保存为批处理使用(但不能用于命令行)
  1. gawk "NR==1{printf(\"\\\"%%s\\\" ^& @CRLF\",$0);next}!NF{printf(\"%%s\",\" ^& @CRLF\")}NF{printf(\" ^& _\n\\\"%%s\\\" ^& @CRLF\",$0)}" 1.txt>2.txt
复制代码
1

评分人数

TOP

回复  hnfeng

将:以ANSI编码保存为1.txt
下载gawk(  )后执行:2.txt就是你需要的结果
hfxiang 发表于 2023-4-23 08:43



    多谢了。在命令行里面完美完成。保存为批处理出错,不过也能用了,谢谢

TOP

vbs,另存为 ANSI 编码没用正则,就字符串替换
没处理文末有换行的情况,假定文末没有空行
czjt1234 发表于 2023-4-22 20:43



    可以很好完成。多谢

再次感谢上面的几位朋友帮助

TOP

回复 1# hnfeng

将:
  1. 文字文字文字文字文字文字文字文字文字文字文字
  2. 文字文字文字文字文字文字文字文字
  3.    文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  4.           文字文字文字文字文字文字文字文字
  5. 文字文字文字文字文字文字
  6.       文字文字文字文字文字文字文字文字文字
复制代码
以ANSI编码保存为1.txt
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )后执行:
  1. gawk "NR==1{printf(\"\\\"%s\\\" ^& @CRLF\",$0);next}!(NF){printf(\"%s\",\" ^& @CRLF\")}NF{printf(\" ^& _\n\\\"%s\\\" ^& @CRLF\",$0)}" 1.txt>2.txt
复制代码
2.txt就是你需要的结果

TOP

本帖最后由 czjt1234 于 2023-4-22 20:46 编辑

vbs,另存为 ANSI 编码
  1. s = ""
  2. Set oStream = CreateObject("ADODB.Stream")
  3. oStream.Type = 2
  4. oStream.Charset = "GBK"         '指定文件编码
  5. oStream.Mode = 3
  6. oStream.Open()
  7. oStream.LoadFromFile "1.txt"    '加载文件
  8. Do Until oStream.EOS
  9.     t = oStream.ReadText(-2)    '读取一行
  10.     If t <> "" Then t = Chr(34) & t & Chr(34)
  11.     s = s & t & vbCrLf
  12. Loop
  13. s = Left(s, Len(s) - 2)
  14. s = RePlace(s, vbCrLf, " & @CRLF & _" & vbCrLf)
  15. s = RePlace(s, "& _" & vbCrLf & " & @CRLF & _", "& @CRLF & _")
  16. oStream.Close()
  17. oStream.Open()
  18. oStream.WriteText s & " & @CRLF"
  19. oStream.SaveToFile "2.txt", 2
  20. MsgBox s & " & @CRLF"
复制代码
没用正则,就字符串替换
没处理文末有换行的情况,假定文末没有空行

QQ 20147578

TOP

来个Python版
  1. import pathlib
  2. test_name = pathlib.Path("1.txt")
  3. save_name = pathlib.Path("save.txt")
  4. res = b''
  5. new_line = b" & @CRLF"
  6. with test_name.open("rb") as f:
  7.     with save_name.open("wb") as res_f:
  8.         line = f.readline()
  9.         while line == b"\r\n":
  10.             line = f.readline()
  11.         while True:
  12.             res += (b'"' + line[:-2] + b'"' + new_line)
  13.             while True:
  14.                 line = f.readline()
  15.                 if line == b'\r\n':
  16.                     res += new_line
  17.                     continue
  18.                 elif line == b'':
  19.                     break
  20.                 else:
  21.                     res += b" & _\r\n"
  22.                     break
  23.             res_f.write(res)
  24.             res = b''
  25.             if line == b"":break
复制代码
QQ:1972544783

TOP

别的正则工具用得少不会了,等会的兄台来帮助你

TOP

看不懂2楼的代码,所以以后想修改或有新需求时,就又要求助了

所以继续请教,有无其他方法,例如使用 fr.exe (find-replace)或其他工具来替换?

TOP

idwma 发表于 2023-4-21 17:55



    谢谢,不懂powershell, 看不懂。
试验后,能完成。谢谢相助!

TOP

  1. #@&cls&type %0|powershell -    &pause&exit
  2. (gc asdf.txt) -join "`n" -replace '(?m)(?<=^)(?!$)|(?<!^)(?=$)','"' -replace '(?<=\n)(?!\n)',' & _' -replace '\n|$',' & @CRLF' -split '(?<=& @CRLF & _)'
复制代码
1

评分人数

TOP

返回列表