Board logo

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

作者: 长风踏雪    时间: 2021-12-8 14:11     标题: 批处理如何根据关键字复制指定段落生成新文档?

输入关键字,从一个指定位置的指定txt文档中拷贝出包含该关键字的段落在另一个指定位置生成一个新的txt文档,每个段落之间都有空行,新的文档开头结尾需要包含空行
作者: flashercs    时间: 2021-12-8 15:01

段落与行有什么区别?最好举个例子.
作者: flashercs    时间: 2021-12-8 16:16

  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)
复制代码

作者: 长风踏雪    时间: 2021-12-8 19:11

回复 2# flashercs


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

202112081101
dsbfuihljkahiosuh
nsdajkiflhkjahsdfklj
bndjksalhfklj
aisjnkdf


2021112081105
sdaljgfjkasd
sdafdsfg
asdgfasd
作者: 长风踏雪    时间: 2021-12-8 19:19

回复 3# flashercs


    大佬厉害,请问大佬能不能把搜索内容和新文件名变成可以手动输入的同一个变量?
作者: flashercs    时间: 2021-12-9 13:27

  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# 长风踏雪
作者: for_flr    时间: 2021-12-9 13:46

回复 3# flashercs


    大佬,请问不用静态方法怎么写
我想请教用cmd-let给文本分段落该怎么写呢
作者: flashercs    时间: 2021-12-9 14:21

回复 7# for_flr
  1. $lines = get-content -path src.txt -delimiter "`r`n`r`n"
复制代码

作者: for_flr    时间: 2021-12-9 14:57

回复 8# flashercs

谢谢指点,可以多问一下吗:
1,`r`n`r`n这个是表示连续按了两次enter键,所以刚好就是一个空行,以此分段?
2,既然这样这么简单,为啥要用静态方法呢,感觉这个打字都会少打一些。
作者: flashercs    时间: 2021-12-9 15:16

回复 9# for_flr
段落分割也可能是多于2个换行符;
用啥无所谓,习惯就行.
作者: for_flr    时间: 2021-12-9 15:30

回复 10# flashercs


   
再看了一次,才明白-split '(\r\n){2,}'那里原来用的是正则表达,`r`n重复两次或多次,跟-delimiter "`r`n`r`n"一个样。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2