【问题标题】:Search string in text file and display until the next delimiter在文本文件中搜索字符串并显示到下一个分隔符
【发布时间】:2014-06-17 17:15:47
【问题描述】:

我有一个文件“servers.txt”:

[Server1] 
Value_A 
Value_B 
Value_C

[Server2] 
Value_A

[Server3] 
Value_A 
Value_B 
Value_C 
Value_D

===

我需要搜索这个文件并显示服务器行 + 他的所有值。 类似的东西:

$search = "server3" 
gc servers.txt | Select-String -Pattern $search and diplay until the next "["

(我说不清楚,比如显示line+1,因为值不同,有时只有3,有时是1,等等)

非常感谢!

【问题讨论】:

  • 您的文件格式与 INI 文件非常相似。您应该能够适应 JPBlanc 的解决方案here

标签: powershell


【解决方案1】:

怎么样:

$search = "server3" 
(gc servers.txt -Delimiter '[') -like  "$search]*" -replace '^','[' -replace '\s*\[$'

更清洁的解决方案(我认为):

(gc servers.txt -raw) -split '\r\n(?=\[)' -like "?$search]*" 

【讨论】:

  • 很好,但是如果我们想要 [Server 2] 部分,这将在末尾添加一个额外的 '[' 行。既然我们无论如何都使用-replace$regex = '(?s).*(\[Server3\][^[]*).*'; (gc servers.txt | out-string) -replace $regex, '$1'
  • 它将是一个多行字符串(不是字符串数组)。 ^ 只会锚定在服务器名称的开头。 -Delimiter 将删除服务器名称之前的第一个 [。 -Replace 只是为了把它放回去。
  • 谢谢!这是可行的,但是是的,它最后显示“[”,我该如何删除它?
  • 我刚刚在这个话题的底部回复了,我认为最简单的方法是从变量中删除最后一行,但我不知道该怎么做。
  • 它被称为“正向前瞻”。基本上它说“在紧跟 [ 字符的任何换行符上拆分。只有换行符是拆分字符。 (?=[) 只是限定哪些换行符将用于拆分而不使 [ 成为拆分字符的一部分,所以[ 保留在数据中。
【解决方案2】:

看起来你的分隔符是一个空行。如何读取文件并对其进行处理,因此第一行是服务器名称,以下所有行直到空白都是数据数组,然后在空白行上它输出一个自定义对象,其中服务器名称和数据数组作为属性,并创建这些对象的数组?

嗯,这很令人困惑,我写了它。让我贴代码,然后解释一下。

$Server = ""
$Data = @()
$Collection = @()
Switch(GC C:\temp\test.txt){
    {[String]::IsNullOrEmpty($Server) -and !([String]::IsNullOrWhiteSpace($_))}{$Server = $_;Continue}
    {!([String]::IsNullOrEmpty($Server)) -and !([String]::IsNullOrEmpty($_))}{$Data+=$_;Continue}
    {[String]::IsNullOrEmpty($_)}{$Collection+=[PSCustomObject]@{Server=$Server;Data=$Data};Remove-Variable Server; $Data=@()}
}
If(!([String]::IsNullOrEmpty($Server))){$Collection+=[PSCustomObject]@{Server=$Server;Data=$Data};Remove-Variable Server; $Data=@()}

好的,首先将变量定义为空字符串或数组。

然后它处理每一行,并根据情况执行三个操作之一。开关的第一行读取文本文件,并逐行处理它。 Switch中的第一个选项基本上是这样写的:

如果 $Server 变量中没有存储任何内容,并且当前行不为空,则 $Server = Current Line。继续下一行。

第二个选项是:

如果 $Server 不为空,并且当前行不为空,则将此行添加到数组 $Data。继续下一行。

Switch 的最后一个选项是:

如果当前行是空白的,那么这是当前记录的结尾。创建具有两个属性的自定义对象。第一个属性名为 Server,其值为 $Server 中的任何值。第二个属性名为 Data,其值是 $Data 中的任何值。然后删除 $server 变量,并将 $Data 重置为空数组。

在切换之后,它会检查 $Server 是否还有数据,如果有则输出最后一个对象。我这样做是为了以防最后一条记录的末尾没有空行,就像清理一样。

剩下的就是 $Collection 是一个对象数组,看起来像这样:

Server                                             Data                                             
------                                             ----                                             
[Server1]                                          {Value_A , Value_B , Value_C}                    
[Server2]                                          {Value_A}                                        
[Server3]                                          {Value_A , Value_B , Value_C , Value_D}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2019-07-28
    • 2017-05-23
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多