Powershell 连接线

niz*_*100 5 powershell

我有如下所示的文本文件:

1.
SometextSometextSometextSometext

2.
SometextSometextSometextSometext

3.
SometextSometextSometextSometext

4.
SometextSometextSometextSometext

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

现在我正在尝试:

$x =  Get-Content *FILENAME*
$x |  Foreach-Object {$_ | select-string "^\d{1,2}\.\s+" }
Run Code Online (Sandbox Code Playgroud)

(注意:我可以匹配选择字符串 "^\d{1,2}.\s+" 但之后不知道如何删除换行符或加入文件)

我正在努力的最终结果:

  1. SometextSometextSometextSometextSometext
  2. SometextSometextSometextSometextSometext
  3. SometextSometextSometextSometextSometext
  4. SometextSometextSometextSometextSometext

bri*_*ist 5

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

这是如何工作的:

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


zda*_*dan 4

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

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