Powershell连接线

Powershell连接线,powershell,Powershell,我的文本文件如下所示: 一,。 SometextSometextSometextSometext 二,。 SometextSometextSometextSometext 三,。 SometextSometextSometextSometext 四,。 SometextSometextSometextSometext 我需要删除编号和下方文本之间的回车符,并且编号(.)和移动文本之间需要有空格,如下所示: 现在我正在尝试: $x = Get-Content *FILENAME* $x

我的文本文件如下所示:

一,。
SometextSometextSometextSometext

二,。
SometextSometextSometextSometext

三,。
SometextSometextSometextSometext

四,。
SometextSometextSometextSometext

我需要删除编号和下方文本之间的回车符,并且编号(.)和移动文本之间需要有空格,如下所示:

现在我正在尝试:

$x =  Get-Content *FILENAME*
$x |  Foreach-Object {$_ | select-string "^\d{1,2}\.\s+" }
(注意:我可以匹配选择字符串“^\d{1,2}.\s+”,但之后不知道如何删除换行符或连接文件)

我想要的最终结果:

  • SometextSometextSometextSometext
  • SometextSometextSometextSometext
  • SometextSometextSometextSometext
  • SometextSometextSometextSometext
  • 试试这个

    $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]
        }
    }
    

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

    $x | Foreach-Object {if($_ -match "^\d{1,2}\.\s+"){$num = $_}else{$num+$_;$num="";} }
    
    $x=获取内容$filename-Raw
    $x-替换“(\d{1,2}\)\s*\r?\n(+?)(\r?\n |$){2,}”,替换“$1$2$3”
    
    工作原理:
  • 使用
    -Raw
    参数调用
    Get Content
    ,将文件作为单个字符串而不是单个行返回。在本例中,由于使用换行符,因此更容易将其视为一个字符串
  • 正则表达式的工作原理如下:
  • 找到一个或两个数字后跟一个
    ,并在组1中捕获该数字
  • 继续匹配任意数量的空格,然后是可选的回车符,然后是一个换行符(这适用于windows/非windows行尾)
  • 匹配1个或多个字符(非贪婪)并在组2中捕获
  • 匹配或CRLF或LF组合或匹配字符串结尾,2次或多次,但仅捕获组3中的第一个实例
  • 现在我们有3个捕获的组:数字和后面的
    ,您想要的行,以及一行结束符(如果存在)
  • 我们用第一组,一个空格,然后是第二组和第三组来替换我们匹配的整个东西

  • 这里有一个解决方案。它使用缓冲方法,但不是将
    +=
    连接到字符串,而是使用StringBuilder,这可以更好地执行。(见附件)

    这将产生:

  • SometextSometextSometextSometext
  • SometextSometextSometextSometext
  • SometextSometextSometextSometext

  • 我试试短一点的:

    Get-Content $my_file -ReadCount 3 | ForEach{$_ -Join " "}
    
    将其拆分为几组线,并用空格连接它们。不知道为什么它是3而不是2老实说,我只是知道它的工作时,我测试它对你提供的样品。下面是我的测试(我将其保存到C:\Temp\test.txt的文本文件中):

    编辑:噢,是3,不是2,因为文本文件中有空行。因此,我认为从技术上讲,这是在每段文本的末尾添加一个空格。可以通过筛选空行来避免这种情况:

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

    这可以通过替换选项实现

    $FirstLast = "Mohammed
    Junaid"
    
    
    $FirstLast -replace ("`n"," ")
    
    结果将是

    "Mohammed Junaid"
    

    我认为你的问题没有任何解决办法。所有的希望都破灭了。一个看似简单的问题怎么会得到5个不同的答案,我敢打赌它们都可能有效(至少在大部分情况下)。@TheMadTechnician文本与Andy Arismnedi一起玩很有趣,我知道你想搞笑,但在网上它却显得很愚蠢:(祝你好运。@NIX100这是一个堆栈溢出问题,你在这个网站上呆了一段时间后就会得到它。管道一次只处理一个对象,但如果该对象是多行字符串,你实际上一次处理多行。@TheMadTechnician很公平,但他不会使用get-content获得多行对象。他将使用-ReadCount:-ReadCount;指定一次通过管道发送的内容行数。默认值为1。值为0(零)时一次发送所有内容。
    PS > Get-Content -ReadCount 3 FILENAME | Write-Host
    1. SometextSometextSometextSometext
    2. SometextSometextSometextSometext
    3. SometextSometextSometextSometext
    4. SometextSometextSometextSometext
    
    $FirstLast = "Mohammed
    Junaid"
    
    
    $FirstLast -replace ("`n"," ")
    
    "Mohammed Junaid"