标题: [文本处理] [已解决]求助批处理替换文本 [打印本页]
作者: hnfeng 时间: 2023-4-21 14:42 标题: [已解决]求助批处理替换文本
本帖最后由 hnfeng 于 2023-4-23 16:47 编辑
一文本文件里有如下的内容:- 文字文字文字文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
- 文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字
- 文字文字文字文字文字文字文字文字文字
复制代码
想用批处理或第三方程序替换为:- "文字文字文字文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
- "文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
- " 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字" & @CRLF & _
- " 文字文字文字文字文字文字文字文字" & @CRLF & @CRLF & _
- "文字文字文字文字文字文字" & @CRLF & _
- " 文字文字文字文字文字文字文字文字文字" & @CRLF
复制代码
即:1、先把连续两个回车换行 \r\n\r\n 替换为 & @CRLF & @CRLF & _,当然文字部分要用双引号括起来
2、再替换 前面不是 _ 的单个回车换行 \r\n 替换为 & @CRLF & _,文字部分也要用双引号括起来
不熟悉正则,研究的头晕也没搞出来,只好想高手求助了,先谢谢了
作者: idwma 时间: 2023-4-21 17:55
- #@&cls&type %0|powershell - &pause&exit
- (gc asdf.txt) -join "`n" -replace '(?m)(?<=^)(?!$)|(?<!^)(?=$)','"' -replace '(?<=\n)(?!\n)',' & _' -replace '\n|$',' & @CRLF' -split '(?<=& @CRLF & _)'
复制代码
作者: hnfeng 时间: 2023-4-22 14:37
idwma 发表于 2023-4-21 17:55
谢谢,不懂powershell, 看不懂。
试验后,能完成。谢谢相助!
作者: hnfeng 时间: 2023-4-22 17:00
看不懂2楼的代码,所以以后想修改或有新需求时,就又要求助了
所以继续请教,有无其他方法,例如使用 fr.exe (find-replace)或其他工具来替换?
作者: idwma 时间: 2023-4-22 20:02
别的正则工具用得少不会了,等会的兄台来帮助你
作者: Gin_Q 时间: 2023-4-22 20:07
来个Python版- import pathlib
-
-
- test_name = pathlib.Path("1.txt")
- save_name = pathlib.Path("save.txt")
-
- res = b''
- new_line = b" & @CRLF"
-
- with test_name.open("rb") as f:
- with save_name.open("wb") as res_f:
- line = f.readline()
- while line == b"\r\n":
- line = f.readline()
- while True:
- res += (b'"' + line[:-2] + b'"' + new_line)
- while True:
- line = f.readline()
- if line == b'\r\n':
- res += new_line
- continue
- elif line == b'':
- break
- else:
- res += b" & _\r\n"
- break
- res_f.write(res)
- res = b''
- if line == b"":break
复制代码
作者: czjt1234 时间: 2023-4-22 20:43
本帖最后由 czjt1234 于 2023-4-22 20:46 编辑
vbs,另存为 ANSI 编码- s = ""
- Set oStream = CreateObject("ADODB.Stream")
- oStream.Type = 2
- oStream.Charset = "GBK" '指定文件编码
- oStream.Mode = 3
- oStream.Open()
- oStream.LoadFromFile "1.txt" '加载文件
- Do Until oStream.EOS
- t = oStream.ReadText(-2) '读取一行
- If t <> "" Then t = Chr(34) & t & Chr(34)
- s = s & t & vbCrLf
- Loop
- s = Left(s, Len(s) - 2)
- s = RePlace(s, vbCrLf, " & @CRLF & _" & vbCrLf)
- s = RePlace(s, "& _" & vbCrLf & " & @CRLF & _", "& @CRLF & _")
- oStream.Close()
- oStream.Open()
- oStream.WriteText s & " & @CRLF"
- oStream.SaveToFile "2.txt", 2
- MsgBox s & " & @CRLF"
复制代码
没用正则,就字符串替换
没处理文末有换行的情况,假定文末没有空行
作者: hfxiang 时间: 2023-4-23 08:43
回复 1# hnfeng
将:- 文字文字文字文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
- 文字文字文字文字文字文字文字文字
-
- 文字文字文字文字文字文字
- 文字文字文字文字文字文字文字文字文字
复制代码
以ANSI编码保存为1.txt
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )后执行:- gawk "NR==1{printf(\"\\\"%s\\\" ^& @CRLF\",$0);next}!(NF){printf(\"%s\",\" ^& @CRLF\")}NF{printf(\" ^& _\n\\\"%s\\\" ^& @CRLF\",$0)}" 1.txt>2.txt
复制代码
2.txt就是你需要的结果
作者: hnfeng 时间: 2023-4-23 09:36
vbs,另存为 ANSI 编码没用正则,就字符串替换
没处理文末有换行的情况,假定文末没有空行
czjt1234 发表于 2023-4-22 20:43
可以很好完成。多谢
再次感谢上面的几位朋友帮助
作者: hnfeng 时间: 2023-4-23 09:44
回复 hnfeng
将:以ANSI编码保存为1.txt
下载gawk( )后执行:2.txt就是你需要的结果
hfxiang 发表于 2023-4-23 08:43
多谢了。在命令行里面完美完成。保存为批处理出错,不过也能用了,谢谢
作者: hfxiang 时间: 2023-4-23 10:26
回复 10# hnfeng
命令行与批处理对于百分号(%)的表述有差异,8楼的指令只能用于命令行方式执行,以下指令需保存为批处理使用(但不能用于命令行)- gawk "NR==1{printf(\"\\\"%%s\\\" ^& @CRLF\",$0);next}!NF{printf(\"%%s\",\" ^& @CRLF\")}NF{printf(\" ^& _\n\\\"%%s\\\" ^& @CRLF\",$0)}" 1.txt>2.txt
复制代码
作者: hnfeng 时间: 2023-4-23 10:29
回复 hnfeng
命令行与批处理对于百分号(%)的表述有差异,8楼的指令只能用于命令行方式执行,以下指令 ...
hfxiang 发表于 2023-4-23 10:26
原来如此,谢谢
作者: qixiaobin0715 时间: 2023-4-26 14:43
好像用cmd也能处理这个问题:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* 1.txt') do (
- if "%%j"=="" (
- echo,!str! ^& @CRLF ^& @CRLF ^& _
- set str=
- ) else (
- if defined str echo, !str! ^& @CRLF ^& _
- set "str=%%j"
- )
- )
- if defined str echo, !str! ^& @CRLF ^& _
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |