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

时间:2019-02-09 17:26:17

标签: regex powershell split

我一直在尝试使用PowerShell从.txt文件中的多行中提取某些等于import React from "react"; function createTab(page, props) { return (<li className="nav-item"> <a href={"#" + page} onClick={() => props.handlePageChange(page)} className={"nav-link" + (props.currentPage === page? " active" : "")}> {page} </a> </li>) }; function NavTabs(props) { return ( <ul className="nav nav-tabs"> {createTab("Home", props)} {createTab("About", props)} {createTab("Blog", props)} {createTab("Contact", props)} </ul> ); }; export default NavTabs; 的值来获取倒数第六个单词。

到目前为止,我已有代码:

40

Txt文件:(可能是重复的行,例如hostname01)

$file = Get-Content 'c:\temp\file.txt'
$Array = @()
foreach ($line in $file)
{
$Array += $line.split(",")[6]
}
$Array
$Array | sc "c:\temp\export2.txt"

这就是我想要的:

4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname02,xx,1549429809,0000000507,1549430316,xxx,0,15,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname03 developer host,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100
4626898,0,3,0,POL,INCR,hostname01,xx,1549429809,0000000507,1549430316,xxx,0,40,1,xxxx,51870834,5040,100

4 个答案:

答案 0 :(得分:3)

这不是 fast 解决方案,而是便捷灵活的解决方案:

  • 由于您的文本文件实际上是CSV文件,因此您可以使用Import-Csv

    • 由于缺少数据,因此是标头行(列名),我们可以通过其Import-Csv参数将其提供给-Header
    • 由于您对列号7(主机名)和14(其值应为40的列)感兴趣,因此我们需要提供(我们选择的)列名对于第1至14列。
  • Import-Csv方便地将CSV行转换为(自定义)对象,您可以使用Where-Object查询其属性,并使用Select-Object进行选择性提取;添加-Unique会抑制重复值。

将它们放在一起:

Import-Csv c:\temp\file.txt -Header (1..14) | 
  Where-Object 14 -eq 40 |
    Select-Object -ExpandProperty 7 -Unique

为方便起见,我们使用范围表达式(1命名了列21..14,...,但是您可以随意使用描述性名称

假设c:\temp\file.txt包含您的示例数据,以上结果将得出:

hostname01
hostname03 developer host

要输出到文件,请将上面的内容通过管道传递到Set-Content,如您的问题:

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

答案 1 :(得分:0)

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

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

Demo here

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

以下应与您要尝试的工作一起使用

Get-Content 'c:\temp\file.txt' | %{ 
    $_.Split(',')[6]
}| select -Unique