我的文字文件如下所示:
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 +"但是之后不知道如何删除换行符或加入文件)
最终结果我正在尝试:
答案 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'
Get-Content
参数调用-Raw
会将文件作为单个字符串而不是单个行返回。在这种情况下,由于您正在使用换行符,因此更容易将其全部视为一个字符串。.
,然后在第1组中捕获。.
,你想要的行,如果它存在,则会有一行结束。答案 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;
}
}
输出:
- SometextSometextSometextSometext
- SometextSometextSometextSometext
- SometextSometextSometextSometext
醇>
答案 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"