Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 通过正则表达式从行中拆分特定字符串_Regex_Powershell_Split - Fatal编程技术网

Regex 通过正则表达式从行中拆分特定字符串

Regex 通过正则表达式从行中拆分特定字符串,regex,powershell,split,Regex,Powershell,Split,我一直在尝试提取某些等于40的值,并使用PowerShell从.txt文件的多行中获取最后六个字 到目前为止,我有以下代码: $file = Get-Content 'c:\temp\file.txt' $Array = @() foreach ($line in $file) { $Array += $line.split(",")[6] } $Array $Array | sc "c:\temp\export2.txt" Txt文件:(可能是重复的行,如hostname01) 这就是我想要

我一直在尝试提取某些等于
40
的值,并使用PowerShell从.txt文件的多行中获取最后六个字

到目前为止,我有以下代码:

$file = Get-Content 'c:\temp\file.txt'
$Array = @()
foreach ($line in $file)
{
$Array += $line.split(",")[6]
}
$Array
$Array | sc "c:\temp\export2.txt"
Txt文件:(可能是重复的行,如hostname01)

这就是我想要的:

hostname01
hostname02
hostname03 developer host

您可以使用非捕获组查看字符串的正确格式,并使用第一个捕获组引用6元素的名称
$1

(?:\d+,\d,\d,\d,[A-Z]+,[A-Z]+,)([a-zA-Z 0-9]+)

  • (?:)
    -指定一个非捕获组(这意味着它不是通过$1或$2引用的,就像您通常使用捕获组一样)
  • \d+,
    (我不会重复所有这些,但是)查找后跟文字的一个或多个数字
  • [A-Z]+,
    -查找全大写字母字符串,后跟文字
    (出现两次)
  • ([a-zA-Z 0-9]+)-您要查找的捕获组,$1,它将捕获所有字符
    a-Z
    a-Z
    、空格和数字,直到不在此集中的字符(在本例中为逗号)。提供您要查找的文本

如果所需字段始终是行中的第6个字段,则更容易拆分每行并获取第6个成员:

Get-Content 'c:\temp\file.txt' | Foreach-Object {($_ -split ',')[6]} | Select-Object -Unique

下面的内容应该与您正在尝试的内容配合使用

Get-Content 'c:\temp\file.txt' | %{ 
    $_.Split(',')[6]
}| select -Unique
这不是一个快速的解决方案,而是一个方便灵活的解决方案:

  • 由于文本文件实际上是CSV文件,因此可以使用
    导入CSV

    • 由于您的数据缺少标题行(列名),我们可以通过其
      -header
      参数将其提供给
      导入Csv
    • 由于您对列编号
      7
      (主机名)和
      14
      (其值应为
      40
      )感兴趣,我们需要为列1到14提供列名称(由我们选择)
  • 导入Csv
    可以方便地将Csv行转换为(自定义)对象,您可以使用
    Where Object
    查询其属性,并使用
    选择对象
    有选择地提取;添加
    -Unique
    会抑制重复值

总而言之:

Import-Csv c:\temp\file.txt -Header (1..14) | 
  Where-Object 14 -eq 40 |
    Select-Object -ExpandProperty 7 -Unique
为方便起见,我们使用范围表达式(
1..14
)命名了列
1
2
,…但您可以自由使用描述性名称

假设
c:\temp\file.txt
包含您的示例数据,则上述结果为:

hostname01
hostname03 developer host
要输出到文件,请将上述内容通过管道传输到
设置内容
,如您的问题所示:

... | Set-Content c:\temp\export2.txt

但我会提取某些等于40的值来得到最后的第六个字。恐怕我不明白你的意思。对不起。我的意思是,我只想捕获属于
40
值的行,例如4626898,0,3,0,POL,INCR,hostname01,xx,15494298090000005071549430316,xxx,0,
40
,1,xxxx,518708345040100。有一个关于代码的速度相关后续问题。
... | Set-Content c:\temp\export2.txt