Powershell连接线

时间:2014-08-12 22:18:33

标签: powershell

我的文字文件如下所示:

1。
SometextSometextSometextSometext

2。
SometextSometextSometextSometext

3。
SometextSometextSometextSometext

4。
SometextSometextSometextSometext

我需要删除数字和它下面的文本之间的回车符,并且数字(。)和移动的文本之间需要有一个空格,如下所示:

现在我正在尝试:

$x =  Get-Content *FILENAME*
$x |  Foreach-Object {$_ | select-string "^\d{1,2}\.\s+" }

(注意:我可以匹配select-string" ^ \ d {1,2}。\ s +"但是之后不知道如何删除换行符或加入文件)

最终结果我正在尝试:

  1. SometextSometextSometextSometext
  2. SometextSometextSometextSometext
  3. SometextSometextSometextSometext
  4. SometextSometextSometextSometext

7 个答案:

答案 0 :(得分:3)

我会尝试更短的时间:

Get-Content $my_file -ReadCount 3 | ForEach{$_ -Join " "}

将它分成几组线,并用空格连接它们。不知道为什么它是3而不是2,说实话,我只知道它对我提供的样本进行测试时有效。下面是我的测试(我将其保存到C:\ Temp \ Test.txt中的文本文件):

PS C:\> gc C:\temp\test.txt -ReadCount 3 | %{$_  -join " "}
1. SometextSometextSometextSometext 
2. SometextSometextSometextSometext 
3. SometextSometextSometextSometext 
4. SometextSometextSometextSometext

编辑:哦,呃,它不是3,因为文本文件中有空行。所以我认为从技术上讲,这是在每段文字的末尾添加一个空格。通过过滤空行可以避免这种情况:

Get-Content $my_file -ReadCount 3 | ForEach{($_ | Where{![String]::IsNullorEmpty($_)}) -Join " "}

答案 1 :(得分:2)

由于管道一次只能运行一行,因此最简单的方法是将数字保存在缓冲区中,并在到达下一行时输出:

$x | Foreach-Object {if($_ -match "^\d{1,2}\.\s+"){$num = $_}else{$num+$_;$num="";} }

答案 2 :(得分:2)

$x = Get-Content $filename -Raw
$x -replace '(\d{1,2}\.)\s*\r?\n(.+?)(\r?\n|$){2,}','$1 $2$3'

如何运作:

  1. 使用Get-Content参数调用-Raw会将文件作为单个字符串而不是单个行返回。在这种情况下,由于您正在使用换行符,因此更容易将其全部视为一个字符串。
  2. 正则表达式的工作方式如下:
    1. 找到1或2位数后跟.,然后在第1组中捕获。
    2. 继续匹配任意数量的空格,然后是可选的回车符,然后是单个换行符(这应该适用于窗口/非窗口行结尾)。
    3. 匹配1个或多个字符(非贪婪)并在第2组中捕获。
    4. 匹配或CRLF或LF组合匹配字符串的结尾2次或更多次,但仅捕获组3中的第一个实例
  3. 所以现在我们有3个被捕获的组:数字和它之后的.,你想要的行,如果它存在,则会有一行结束。
  4. 我们替换与组1匹配的整个事物,单个空格,然后组2和组3。

答案 3 :(得分:0)

试试这个

$lines = Get-Content $my_file

for ($i = 0; $i -le $lines.Count; $i+=3) {
    if ($lines[$i] -match '^\d+?\.') {
        $lines[$i].TrimEnd() + ' ' + $lines[$i + 1]
    }
}

答案 4 :(得分:0)

这是一个解决方案。它使用缓冲方法,但不是+=连接到字符串,而是使用StringBuilder,它可以更好地执行。 (见this blog post

$source = (
"1.",
"SometextSometextSometextSometext",
"",
"2.",
"SometextSometextSometextSometext",
"3.",
"",
"SometextSometextSometextSometext"
);


$stringBuilder = New-Object System.Text.StringBuilder

$source | % {
    if ($_ -match [regex]'^\d+\.') {
        $null = $stringBuilder.Append("{0} " -f $_)
    }
    if ($_ -match [regex]'^[A-Za-z]') {
            $null = $stringBuilder.Append($_)
            $stringBuilder.ToString();
            $stringBuilder.Length = 0;
    }
} 

输出:

  
      
  1. SometextSometextSometextSometext
  2.   
  3. SometextSometextSometextSometext
  4.   
  5. SometextSometextSometextSometext
  6.   

答案 5 :(得分:0)

PS > Get-Content -ReadCount 3 FILENAME | Write-Host
1. SometextSometextSometextSometext
2. SometextSometextSometextSometext
3. SometextSometextSometextSometext
4. SometextSometextSometextSometext

答案 6 :(得分:0)

这可以通过替换选项来实现。

$FirstLast = "Mohammed
Junaid"


$FirstLast -replace ("`n"," ")

结果将是

"Mohammed Junaid"