使用 \appropriate \scape:

使用 \appropriate \scape:

如何从文件中提取两个字符串之间的文本并将输出保存到另一个文件,并在命令行中批量调用它?

更具体地说,假设输入文件是SomeFile.txt,我想提取字符串和之间的所有内容\StartHere并将\EndHere其保存到SomeFile.log

为此,我需要一个程序,让我们TextExtract在命令行中使用这四个程序来调用它parameters,如下所示:

> TextExtract SomeFile.txt '\StartHere' '\EndHere' SomeFile.log

在 Wondows 10 中是否有任何特定的命令行程序可以执行此操作,或者可以在命令行运行某些脚本(使用如上所述的参数)?

答案1

使用 PowerShell 时,此操作很容易。

来自帖子 PowerShell 使用 -Tail 和 -Wait 提取两个字符串之间的文本 您可以使用 PowerShell 函数 Theo 的回答

function Get-TextBetweenTwoStrings ([string]$startPattern, [string]$endPattern, [string]$filePath){
    # Get content from the input file
    $fileContent = Get-Content -Path $filePath -Raw
    # Regular expression (Regex) of the given start and end patterns
    $pattern = '(?is){0}(.*?){1}' -f [regex]::Escape($startPattern), [regex]::Escape($endPattern)
    # Perform the Regex operation and output
    [regex]::Match($fileContent,$pattern).Groups[1].Value
}

该函数调用的一个示例是:

$inputFile    = "D:\Test\THE-LOG-FILE.log"
$startPattern = 'START-OF-PATTERN'
$endPattern   = 'END-OF-PATTERN'

Get-TextBetweenTwoStrings -startPattern $startPattern -endPattern $endPattern -filePath $inputFile

要将找到的文本存储在文件中,请添加调用:

Get-TextBetweenTwoStrings ... | Set-Content -Path 'X:\wherever\theoutput.txt'

答案2

...让我们称其TextExtract为在命令中调用
包含四个参数,如下所示:

> TextExtract.Script .\SomeFile.txt '\StartHere' '\EndHere' .\SomeFile.log

当涉及到/
调用解释你的

> PowerShell flag#1 flag#2 ... flag#N & 'Script.ps1' $Args[1] $Args[2] $Args[3] ... $Args[N] [-WindowStyle Hidden] [among other options] ...

> Powershell.exe -ExecutionPolicy ByPass -File "D:\The\Full\Path\To\TextExtract.ps1" "D:\The\Full\Path\To\SomeFile.txt" "StartString"  "EndStrings" "D:\The\Full\Path\To\SomeFile.Log"

TextExtract.ps1

使用 \appropriate \scape:

PowerShell -ExecutionPolicy Bypass -File "D:\The\Full\Path\To\TextExtract.ps1" "D:\The\Full\Path\To\SomeFile.txt" "\hic incipit"  "\hic terminus" "D:\The\Full\Path\To\SomeFile.Log"

$Start = $args[1].replace('\','\\')
$Ends  = $args[2].replace('\','\\')

$MyInvocation.MyCommand.Path | Split-Path | Push-Location

$Path  = [System.IO.Path]::GetFullPath($args[0])
$Logs  = [System.IO.Path]::GetFullPath($args[3])

if (!($?)) { 
    $null | Out-File -FilePath (Resolve-Path $args[3] | Select -ExpandProperty Path ) 
    $Logs = [System.IO.Path]::GetFullPath($args[3])
  }

$Expr = "(cat $Path -Raw | sls ('$Start.*$Ends')) -split('($Start.*$Ends)')"
$Strs = Invoke-Expression -Command "$Expr" ; Out-File $Logs -InputObject $Strs[1] -Force

In sollicitudin tincidunt turpis, amet nec dui feugiat neque 
eleifend id hic incipit Nunc hic terminus quis et tellus 
rutrum placerat. Nam et lorem ligula. Vivamus ante risus, 
volutpat ac ultrices in, ultricies nec dolor. In hac 
habitasse platea dictumst. 

在此处输入图片描述


针对感兴趣的搜索线设置尽可能准确的过滤器。

 sls (('starthere.*endhere'))
 sls (('hic incipit.*hic terminus'))

分割线路结果并在线路分割中选择合适的线路结果,其中:

...) -split('(hic incipit.*hic terminus)')
[0] before the string of interest
[1] string of interest // ... hic incipit Nunc hic terminus ... 
[2] after the string of interest

$Strings=$(gc .\SomeFile.txt -Raw | sls ('hic incipit.*hic terminus')) -split('(hic incipit.*hic terminus)') 
$Strings[1]
  • 结果
hic incipit Nunc hic terminus

观察1:考虑观察需要转义的字符的存在,因为这里的初始和最终搜索间隔是虚构的,真实的搜索间隔可能需要一些预处理<in code>编辑。

PowerShell   ...   "\hic incipit" "\hic terminus" ...
// <code> $Start = $args[1].replace('\','\\') </code>
// <code> $Ends  = $args[2].replace('\','\\') </code>

观察2:您可以在驱动器\文件夹中调用此脚本,而不是调用该脚本的位置:

C:\Windows\System32>PowerShell -executionpolicy bypass -file "D:\The\Full\Path\To\TextExtract.ps1" "D:\The\Full\Path\To\SomeFile.txt" "\hic incipit"  "\hic terminus" "D:\The\Full\Path\To\SomeFile.Log"

观察3:如果您的命令将在保存脚本的文件夹中调用,则可以使用路径.\相对:

PowerShell -ExecutionPolicy Bypass -File .\"TextExtract.ps1" .\"SomeFile.txt" "\hic incipit"  "\hic terminus" .\"SomeFile.Log"

观察4:当前版本如果文件不存在则创建它"SomeFile.Log"$args[3]),如果文件存在则覆盖它,如果文件不存在则创建它并通过附加它来提供它,请替换:

Out-File $Logs -InputObject $Strs[1] -Force
Out-File $Logs -InputObject $Strs[1] -Append

其他资源:

相关内容