标题: [文本处理] [已解决]求助批处理删除TXT文本 书名号之外的内容 [打印本页]
作者: lj670 时间: 2024-10-27 14:36 标题: [已解决]求助批处理删除TXT文本 书名号之外的内容
当前文件夹内00.txt文件,文本内容若干行,删除每行书名号《》之外的内容,每行只有一个《》,输出最好是修改原文件
示例:
10《一场梦一场秋雨》20句
162《远方的人》长短
20《曾经来过》保留
处理后
《一场梦一场秋雨》
《远方的人》
《曾经来过》
作者: Five66 时间: 2024-10-27 16:20
编码全部ansi
运行后会生成新文件OO.txt- @echo off&chcp 936
- (
- for /f "eol=? delims=" %%a in (00.txt) do (
- set "line=%%a"
- setlocal enabledelayedexpansion
- set line=《!line:*《=!
- for /f "tokens=1 delims=》" %%b in ("!line!") do (
- endlocal
- set "line=%%b》"
- )
- if "!nil!" == "%nil%" endlocal
- setlocal enabledelayedexpansion
- echo:!line!
- endlocal
- ))>>OO.txt
- echo done!!!
- pause&exit/b
复制代码
作者: 银八 时间: 2024-10-27 17:22
针对楼主所说每行只有一组《》,可用这段代码试下(ASCII)
bat和txt放同一路径下直接运行- @echo off&chcp 65001
- for /f "tokens=1,2,3 delims=《》" %%a in (00.txt) do echo 《%%b》>>新文件.txt
复制代码
作者: aloha20200628 时间: 2024-10-27 19:13
本帖最后由 aloha20200628 于 2024-10-27 19:16 编辑
回复 1# lj670
cmd窗口一行流》须在本坛第三方下载 sed.exe http://bcn.bathome.net/s/tool/index.html?key=sed 置于 00.txt 同目录运行...
- sed -r "s/[^《》]*《([^《》]+)》[^《》]*/《\1》/g" 00.txt
复制代码
作者: lj670 时间: 2024-10-27 19:39
回复 4# aloha20200628 下载4.9版sed,bat和文本为ANSI,运行一闪而过没有作用。
作者: lj670 时间: 2024-10-27 19:43
回复 3# 银八 运行后文本只有《》了,书名号里的文字也没有了
作者: lj670 时间: 2024-10-27 19:48
回复 2# Five66 运行后生成的新文件是对的,请问大神能否直接修改原文件呢?
作者: 77七 时间: 2024-10-27 20:26
- @echo off
- rem 批处理和文本全部保存为ansi编码
- cd /d "%~dp0"
- (for /f "useback delims=" %%a in ("00.txt") do (
- for /f "tokens=2 delims=《》" %%b in ("#%%a#") do (
- echo 《%%b》
- )
- )) > $
- move $ "00.txt"
- pause
复制代码
作者: lj670 时间: 2024-10-27 21:34
回复 8# 77七 运行后,完美,谢谢!
作者: aloha20200628 时间: 2024-10-27 22:07
回复 5# lj670
已用一楼的示例文件 00.txt 测试通过... 楼主用以下代码能看见屏显的正确结果吗?
- sed -r "s/[^《》]*《([^《》]+)》[^《》]*/《\1》/g" "00.txt"&echo,&pause
复制代码
作者: lj670 时间: 2024-10-27 22:45
回复 10# aloha20200628 频显是对的,但没有输出,原文件没变
作者: aloha20200628 时间: 2024-10-27 23:02
本帖最后由 aloha20200628 于 2024-10-27 23:07 编辑
回复 11# lj670
还是用一行流解决吧...
- sed -r "s/[^《》]*《([^《》]+)》[^《》]*/《\1》/g" "00.txt">"_" & move /y "_" "00.txt"
复制代码
作者: lj670 时间: 2024-10-27 23:21
回复 12# aloha20200628 这个完美!!👍👍
作者: qixiaobin0715 时间: 2024-10-28 08:20
- @echo off
- (for /f "tokens=1-2 delims=《》" %%a in (00.txt) do if "%%b"=="" (echo,《%%a》) else echo,《%%b》)>temp
- del 00.txt
- ren temp 00.txt
- pause
复制代码
作者: hfxiang 时间: 2024-10-28 10:30
回复 12# aloha20200628
尝试用-i参数,看是不是可简化如下 :
[code]
sed -i -r "s/^.*(《.*》).*$/\1/" 00.txt
作者: aloha20200628 时间: 2024-10-28 12:46
回复 15# hfxiang
如源文件中每行包含多个《...》字段,用15楼代码匹配最后一个《...》字段,用12楼代码则匹配所有《...》字段,因实况自取吧...
作者: lj670 时间: 2024-10-28 19:23
回复 15# hfxiang 可以可以,测试完美,这个最简化,厉害!大神能否再写一个,还是这个文本,只删除《左书名号之前的内容,其他的保留,
谢谢!
例如:
162《远方的人》长短
20《曾经来过》保留
运行删除后:
《远方的人》长短
《曾经来过》保留
作者: lj670 时间: 2024-10-28 19:32
回复 14# qixiaobin0715 完美可用,分没有了,明天再给加分!大神能否再写一个,还是这个文本,只删除《左书名号之前的内容,其他的保留,
谢谢!
例如:
162《远方的人》长短
20《曾经来过》保留
运行删除后:
《远方的人》长短
《曾经来过》保留
作者: lj670 时间: 2024-10-28 19:34
回复 16# aloha20200628
谢谢,受教了!
作者: qixiaobin0715 时间: 2024-10-29 08:39
本帖最后由 qixiaobin0715 于 2024-10-29 08:57 编辑
回复 18# lj670
加不加分倒是无所谓,积分又没什么用处, 解决问题才是关键:- @echo off
- (for /f "tokens=1* delims=《" %%a in (00.txt) do (
- if "%%b"=="" (
- echo,《%%a
- ) else (
- echo,《%%b
- )
- ))>temp
- del 00.txt
- ren temp 00.txt
- pause
复制代码
未经测试。
上面代码只能处理每行都存在书名号的文本,如果存在不含书名号的行,此行的结果可能会有误差,代码就需要修改。
作者: aloha20200628 时间: 2024-10-29 10:48
本帖最后由 aloha20200628 于 2024-10-29 11:29 编辑
假设源文件 00.txt 中包含 1-n 对《...》
一。以下代码删除第一个《 字符之前的内容,覆写源文件...- sed -i "s/[^《》]*《/《/" 00.txt
复制代码
二。以下代码删除最后一个 》字符之后的内容,覆写源文件...- sed -i "s/》[^《》]*$/》/" 00.txt
复制代码
三。以下代码删除每对《...》以外的所有内容,覆写源文件...- sed -i -r "s/[^《》]*《([^《》]+)》[^《》]*/《\1》/g" 00.txt
复制代码
作者: hfxiang 时间: 2024-10-29 19:30
回复 17# lj670
呵呵,可以的- sed -i -r "s/^.*(《.*).*$/\1/" 00.txt
复制代码
作者: lj670 时间: 2024-10-31 15:30
回复 20# qixiaobin0715
感谢,运行完美!
作者: lj670 时间: 2024-10-31 15:32
回复 21# aloha20200628
这个太全面了,都完美运行,感谢感谢!
作者: lj670 时间: 2024-10-31 15:34
回复 22# hfxiang
完美可用,感谢感谢!分加完了,改天在加。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |