0

我是 PowerShell 的新手,希望在文本文件中的某些情况下替换 CRLF。

一个示例文本文件将是:

Begin 1 2 3
End 1 2 3
List asd asd
Begin 1 2 3
End 1 2 3
Begin 1 2 3
End 1 2 3
Sometest asd asd
Begin 1 2 3

如果一行不是以 Begin 或 End 开头,我希望将该行附加到前一行。

所以期望的结果是:

Begin 1 2 3
End 1 2 3 List asd asd
Begin 1 2 3
End 1 2 3
Begin 1 2 3
End 1 2 3 Sometest asd asd
Begin 1 2 3

该文件是制表符分隔的。所以在 Begin 和 End 之后,是一个 TAB。

我尝试了以下方法,只是为了摆脱所有不起作用的 CRLF:

$content = Get-Content c:\test.txt
$content -replace "'r'n","" | Set-Content c:\test2.txt

我已经阅读了 PowerShell 上的 MSDN 并且可以替换不同行上的文本,而不是像这样的多行:(

我在家里测试 Windows 7,但这是为了工作,将在 Vista 上。

4

3 回答 3

2
# read the file
$content = Get-Content file.txt

# Create a new variable (array) to hold the new content
$newContent = @()

# loop over the file content    
for($i=0; $i -lt $content.count; $i++)
{  
  # if the current line doesn't begin with 'begin' or 'end'   
  # append it to the last line םכ the new content variable
  if($content[$i] -notmatch '^(begin|end)')
  {
    $newContent[-1] = $content[$i-1]+' '+$content[$i]
  } 
  else
  {
    $newContent += $content[$i]
  }
}

$newContent
于 2012-10-25T07:32:05.237 回答
1

你觉得这一行怎么样?

gc "beginend.txt" | % {}{if(($_ -match "^End")-or($_ -match "^Begin")){write-host "`n$_ " -nonewline}else{write-host $_ -nonewline}}{"`n"}

Begin 1 2 3
End 1 2 3 List asd asd
Begin 1 2 3
End 1 2 3
Begin 1 2 3
End 1 2 3 Sometest asd asd
Begin 1 2 3
于 2012-10-25T04:09:04.760 回答
0
$data = gc "beginend.txt"

$start = ""
foreach($line in $data) {
    if($line -match "^(Begin|End)") {
        if($start -ne "") {
            write-output $start
        }
        $start = $line
    } else {
        $start = $start + " " + $line
    }
}

# This last part is a bit of a hack.  It picks up the last line
# if the last line begins with Begin or End.  Otherwise, the loop
# above would skip the last line.  Probably a more elegant way to 
# do it :-)
if($data[-1] -match "^(Begin|End)") {
    write-output $data[-1]
}
于 2012-10-25T01:15:21.933 回答