找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18236|回复: 10

[文本处理] 批处理如何根据关键字复制指定段落生成新文档?

[复制链接]
发表于 2021-12-8 14:11:47 | 显示全部楼层 |阅读模式
输入关键字,从一个指定位置的指定txt文档中拷贝出包含该关键字的段落在另一个指定位置生成一个新的txt文档,每个段落之间都有空行,新的文档开头结尾需要包含空行
发表于 2021-12-8 15:01:05 | 显示全部楼层
段落与行有什么区别?最好举个例子.
发表于 2021-12-8 16:16:18 | 显示全部楼层
  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath "%~0" -ReadCount 0 | Out-String ))) "
  5. exit /b
  6. #>
  7. # 源文件
  8. $srcfile = "src.txt"
  9. # 新文件
  10. $dstfile = "dst.txt"
  11. # 查找文本
  12. $search = "0x00"

  13. $encoding = [System.Text.Encoding]::Default
  14. $txt = [System.IO.File]::ReadAllText($srcfile, $encoding)
  15. $lines = $txt -split '(\r\n){2,}' | ForEach-Object {
  16.   if ($_.Contains($search)) {
  17.     ''
  18.     $_
  19.    
  20.   }
  21. }
  22. [System.IO.File]::WriteAllLines($dstfile, $lines, $encoding)
复制代码

评分

参与人数 1技术 +2 收起 理由
for_flr + 2 请问不用静态方法怎么写

查看全部评分

 楼主| 发表于 2021-12-8 19:11:39 | 显示全部楼层
回复 2# flashercs


    大佬好,段落是有许多行,一个时间字符串下面带有几行信息为一个段落,例如:

202112081101
dsbfuihljkahiosuh
nsdajkiflhkjahsdfklj
bndjksalhfklj
aisjnkdf


2021112081105
sdaljgfjkasd
sdafdsfg
asdgfasd
 楼主| 发表于 2021-12-8 19:19:55 | 显示全部楼层
回复 3# flashercs


    大佬厉害,请问大佬能不能把搜索内容和新文件名变成可以手动输入的同一个变量?
发表于 2021-12-9 13:27:30 | 显示全部楼层
  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -NoProfile -ExecutionPolicy RemoteSigned -Command ". ([ScriptBlock]::Create((Get-Content -LiteralPath "%~0" -ReadCount 0 | Out-String ))) "
  5. exit /b
  6. #>
  7. # 源文件
  8. $srcfile = "src.txt"

  9. $encoding = [System.Text.Encoding]::Default
  10. $txt = [System.IO.File]::ReadAllText($srcfile, $encoding)
  11. $lines = $txt -split '(\r\n){2,}'
  12. while ($true) {
  13.   try {
  14.     $search = Read-Host -Prompt '请输入搜索内容(直接回车退出脚本)'
  15.     if ($search -eq [string]::Empty) { break }
  16.     $result = $lines | ForEach-Object {
  17.       if ($_.Contains($search)) {
  18.         ''
  19.         $_
  20.       }
  21.     }
  22.     if ($null -eq $result) {
  23.       Write-Host '未找到内容' -ForegroundColor Red
  24.     } else {
  25.       [System.IO.File]::WriteAllLines($search, $result, $encoding)
  26.     }
  27.   } catch {
  28.     $_ | Write-Host -ForegroundColor Red
  29.   }
  30. }
复制代码
回复 5# 长风踏雪
发表于 2021-12-9 13:46:46 | 显示全部楼层
回复 3# flashercs


    大佬,请问不用静态方法怎么写
我想请教用cmd-let给文本分段落该怎么写呢
发表于 2021-12-9 14:21:04 | 显示全部楼层
回复 7# for_flr
  1. $lines = get-content -path src.txt -delimiter "`r`n`r`n"
复制代码
发表于 2021-12-9 14:57:44 | 显示全部楼层
回复 8# flashercs

谢谢指点,可以多问一下吗:
1,`r`n`r`n这个是表示连续按了两次enter键,所以刚好就是一个空行,以此分段?
2,既然这样这么简单,为啥要用静态方法呢,感觉这个打字都会少打一些。
发表于 2021-12-9 15:16:26 | 显示全部楼层
回复 9# for_flr
段落分割也可能是多于2个换行符;
用啥无所谓,习惯就行.

评分

参与人数 1技术 +1 收起 理由
for_flr + 1 Thanks

查看全部评分

发表于 2021-12-9 15:30:52 | 显示全部楼层
回复 10# flashercs


   
再看了一次,才明白-split '(\r\n){2,}'那里原来用的是正则表达,`r`n重复两次或多次,跟-delimiter "`r`n`r`n"一个样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 17:56 , Processed in 0.032424 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表