【问题标题】:Remove the LF from the test file and leave the CRLF (batch, PowerShell)从测试文件中删除 LF 并保留 CRLF (batch, PowerShell)
【发布时间】:2021-07-21 16:06:31
【问题描述】:

我有一个 .txt 文件,其中一些行以 LF 结尾(此处不应有新行),部分以 CRLF 结尾。如何删除 LF 并离开 CRLF?

这是我的原始文件内容:

我正在尝试以下代码(不起作用,因为它不会删除不必要的换行符 (LF))

(Get-Content $path -Raw).Replace("(?!\r)\n"," ") | Set-Content $path -Force

这是我想要的结果

为了清楚起见,因此,目的是用单个空格字符替换所有LF 字符,这些字符不是直接以CR 字符开头。

附注任何 PowerShell 代码都必须与 2.0 版兼容

【问题讨论】:

  • 顺便说一句,在PowerShell 中,我可能会尝试这样:(Get-Content -Path $path -Raw) -Replace '(?<!\x0D)\x0A',' ' …
  • 我试过这个(Get-Content -Path $path -Raw) -Replace '(?<!\x0D)\x0A',' ' | Set-Content $path -Force,一切都很好,除了我在每行之后得到一个额外的CRLF。我该如何解决这个问题?
  • 请编辑您的问题以包含您正在使用的 PowerShell 版本,并最好包含其适当的标签。我们无法猜测您的 PowerShell 版本至少不是第 5 版,(包含在 Windows 10 版本中并发布了 5½ 年),其中包括您需要的 -NoNewLine 选项和 Set-Content .
  • 我知道,但我需要它才能在不同的机器上工作,包括过时的机器(从 Windows 7 开始)。该问题已被编辑。
  • 我已经进一步编辑了您的问题以澄清因为放置 PowerShell 4,虽然它在版本 5 中排除了带有 Set-Content-NoNewLine 选项,但并没有告诉您的潜在响应者这必须能够在 [windows-7] 中进行默认安装

标签: powershell batch-file powershell-2.0


【解决方案1】:

.replace() 不像-replace 那样接受正则表达式。而且您使用的是负头 (?!) 而不是 negative lookbehind (?<!)regex101.com 对于查看正则表达式的作用很有用。对于原始字符串,您可能需要 -nonewline 选项来设置内容。

"12345`n56789`n09876`r`n" -replace "(?<!\r)\n", " "

12345 56789 09876

【讨论】:

  • -NoNewline我的系统不支持这个,有没有其他方法可以阻止添加CRLF?
【解决方案2】:

通常Get-Content 将在CRLF 或两者CRLF 的任意组合上中断和流线。
您可以使用-Delimiter "`r`n" 参数来防止这种情况发生:

Get-Content $InPath -Delimiter "`r`n" |
ForEach-Object Replace "`n", " " |
Set-Content $OutPath

使用 Powershell 7.1.3 版

测试

【讨论】:

  • 我假设你的意思是ForEach-Object { $_.Replace("`n", " ") }。另外,这会错误地取出最后一个`n
  • ForEach-Object Replace -args "`n", " "
  • @js2010。嗯,尽管ForEach-Object 文档中提到了-MemberName 并使用了-ArgumentList,但这些命令对我来说运行良好(POSH 版本7.1.3)。我想这是因为参数是静态的。 “另外,这会错误地取出最后一个”,注意Get-Contentstream每一行(因为我没有使用-Raw参数),这意味着字符串数组中没有留下任何CrLf(也没有Lf 可以被错误地使用),它们被Set-Content cmdlet 再次恢复。
  • @js2010,实际上您可能对-MemberName 是正确的:("`n", " ") 部分可能被视为位置-ArgumentList 参数(即使文档中也没有说明)。换句话说,删除括号也有效(在答案中更新)。
  • 哦,好的。我正在使用 ps 5 进行测试。
【解决方案3】:

我想你想做这样的事情吗?这是假设每行末尾实际上不存在空格:

@echo off
set "fd="
for /f "delims=" %%a in (input.txt) do call set "fd=%%fd%%%%a "
(echo %fd:~0,-1%)>result.txt

您同时拥有powershellbatch-file 标签,因此是batch-file 解决方案。

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多