使用批处理替换.txt中的EOL之前的字符

时间:2015-12-06 11:51:26

标签: powershell batch-file replace cmd

我想搜索&替换file.txt中每行的结尾并删除之前的字符。

换句话说,我在每一行的末尾都有一个冗余的逗号,在将数据传递给Excel时会让我感到不安。

我无法删除所有逗号,因为大多数逗号都很有价值。我只需删除每行末尾的那些,因为它们会创建一个空白单元格。

我不介意使用PowerShell gc命令。

3 个答案:

答案 0 :(得分:1)

这是删除每行最后一个字符的最简单方法"使用批处理文件:

@echo off
setlocal EnableDelayedExpansion

(for /F "delims=" %%a in (file.txt) do (
   set "line=%%a"
   echo(!line:~0,-1!
)) > output.txt

此批处理文件有一系列限制:它删除以分号开头的空行和行,并从行中删除感叹号。每个限制都可以修复,引入一个修改,最终以与aschipfl的答案类似的代码结束,但这段代码可能足以满足您的需求。

答案 1 :(得分:0)

以下是一个PowerShell脚本,它将文件in.txt作为输入,从每行中删除最后一个字符,然后将它们输出到out.txt

Get-Content "in.txt" | % { $_.Substring(0, ($_.Length - 1)) } | Out-File "out.txt"

添加一个简单的测试来检查您是否只删除逗号:

Get-Content "in.txt" | % {
    if($_.Substring(($_.Length - 1), 1) -eq ",") {
        $_.Substring(0, ($_.Length - 1))
    } else {
        $_
    }
} | Out-File "out.txt"

答案 2 :(得分:0)

这是一个纯粹的解决方案:

以下代码段会移除file.txt中每一行的最后一个字符,,并将结果写入file_new.txt

@echo off
setlocal EnableExtensions
> "file_new.txt" (
    for /F usebackq^ delims^=^ eol^= %%L in ("file.txt") do (
        setlocal DisableDelayedExpansion
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        if "!LINE:~-1!"=="," (
            echo(!LINE:~,-1!
        ) else (
            echo(!LINE!
        )
        endlocal
        endlocal
    )
)
endlocal

需要切换延迟环境变量扩展(请参阅setlocal /?set /?寻求帮助),以避免出现某些特殊字符的问题。

上述方法会从文件中删除空行,因为for /F会忽略它们。要避免这种情况,请使用以下脚本:

@echo off
setlocal EnableExtensions
> "file_new.txt" (
    for /F delims^=^ eol^= %%L in ('findstr /N /R "^" "file.txt"') do (
        setlocal DisableDelayedExpansion
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        set "LINE=!LINE:*:=!"
        if "!LINE:~-1!"=="," (
            echo(!LINE:~,-1!
        ) else (
            echo(!LINE!
        )
        endlocal
        endlocal
    )
)
endlocal

这使用findstr /N /R "^"返回给定文件的每一行(甚至是空行)并在其前面添加行号加:的事实。因此,for /F没有任何行显示为空。插入行set "LINE=!LINE:*:=!"以在输出之前从每行删除该前缀(所有内容直到第一个:)。