【问题标题】:parse lines of text into two variables in powershell在powershell中将文本行解析为两个变量
【发布时间】:2015-01-22 21:27:27
【问题描述】:

我有一个格式如下的测试文件:

    <IPADDRESS1> # <STRINGA>
    <IPADDRESS2> # <STRINGB>
    <IPADDRESS3> # <STRINGA;STRINGB>

有时会有多个字符串用“;”隔开

我想在 PowerShell 中将其解析为每个 IP / String 组合的数组并输出到 CSV

期望的输出:

    IPAddress1,STRINGA
    IPAddress2,STRINGB
    IPAddress3,STRINGA
    IPAddress3,STRINGB

我目前在使用 PowerShell 时遇到的这个问题是,当我通过管道将其拆分时,我无法让 ForEach 将 IP 地址部分传递到带有辅助字符串的新行中:

get-content C:\file.txt | %{$_ -replace " # ",""} | %{$_ -split ";"}

本例中的输出:

    IPAddress1,STRINGA
    IPAddress2,STRINGB
    IPAddress3,STRINGA
    STRINGB

注意,这缺少最后一行的 IP 地址。

我的想法是,我需要将每一行文本读入某种解析函数来处理地址和字符串并构建一个数组,以便将此数组输出到 csv。

任何帮助都会很棒,如果有更简单的方法可以做到这一点,请告诉我。我仅限于powershell。

【问题讨论】:

标签: arrays parsing powershell csv ip-address


【解决方案1】:

使用您的测试数据(无法真正判断这些 是否应该是数据的一部分):

$text = 
'IPADDRESS1 # STRINGA',
'IPADDRESS2 # STRINGB',
'IPADDRESS3 # STRINGA;STRINGB'

$text | foreach {
$Address,$Strings = $_.split('#').trim()
Foreach ($String in $Strings.split(';'))
 {"$Address,$String" }
}


IPADDRESS1,STRINGA
IPADDRESS2,STRINGB
IPADDRESS3,STRINGA
IPADDRESS3,STRINGB

【讨论】:

  • 不错。没有意识到 ,&lt;substitute&gt;-replace 运算符上是可选的。一直以来,当我只想删除文本时,我一直在传递''。 :-)
  • "" 不在数据中。
  • 针对新的数据要求进行了更新。
  • 必须在处理空格之前添加Foreach {$_ -replace ' # ','#'},但这对我有用。谢谢!
  • 那个 .trim() 应该处理好空格。你运行的是什么版本?
【解决方案2】:

这是你想要做的吗?

Get-Content C:\file.txt | % { 
    if($_ -match '<(.*?)>\s+#\s+<(.*?)>') {
        $Matches[2] -split ';' | % { "$($Matches[1]),$_" }
    } else { Write-Host "Line '$_' doesn't match regex" }
}

IPADDRESS1,STRINGA
IPADDRESS2,STRINGB
IPADDRESS3,STRINGA
IPADDRESS3,STRINGB

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2019-04-06
    • 2021-12-27
    • 2022-07-01
    • 2021-10-19
    • 2020-10-09
    • 2016-01-22
    • 2019-05-30
    • 2019-07-30
    相关资源
    最近更新 更多