【问题标题】:Removing all spaces, tabs from a .txt file从 .txt 文件中删除所有空格、制表符
【发布时间】:2019-02-26 08:21:50
【问题描述】:

我想从 txt 文件中删除所有空格和制表符。以下是我尝试执行此操作的代码:

for /F "delims=" %%a in (CODE_CHECK.txt) do (
   set one=%%a
   set one=%one:=%
) >> CODE_CHECK_2.txt

示例文件行:

ONE VIEW

TWO PACKEGE BODY

代码之后应该是:

ONEVIEW

TWOPACKEGEBODY

【问题讨论】:

  • 你有两个问题。一,代码没有将更改的变量输出到输出文件。二、需要使用延迟扩展。
  • 猫 CODE_CHECK.txt | sed 's/[[:space:]]//g' >> CODE_CHECK_2.txt 这对我有用!
  • @RaitisLebedevs 嗯?这是 Windows 批处理文件,而不是 bash ......你是如何混淆这些的?由于不清楚,投票结束这个话题。
  • 在从文本文件中删除所有普通空格和水平制表符方面,一切都比 Windows command 处理器好。因此,我建议考虑使用预安装的 VBScript、JScript、PowerShell 或 Python、Perl 或任何文本编辑器等替代方案。但是,如果您想使用最不适合此任务的应用程序执行此操作,则需要在 set "one=%%a" 之后启用 delayed expansion,在 set "one=!one: =!"set "one=!one:TAB=!"echo(!one! 上使用 next,然后在循环。
  • 阅读this answer 了解有关启用和禁用延迟扩展所需的命令 SETLOCALENDLOCAL 的详细信息。在 FOR 循环之前使用 setlocal EnableDelayedExpansion 仅启用一次,在 FOR 循环之后使用 endlocal 仅禁用一次会导致文本文件中包含 on 或更多的行损坏!在线set "one=%%a"。此外,您的 FOR 循环完全忽略空行和以 ; 开头的行。

标签: batch-file tabs spaces


【解决方案1】:

鉴于文件包含少于 64K 行且每行长度少于 8K 字节/字符,不需要保留空行,并且该文件是 ASCII/ANSI 编码,带有 DOS/Windows 样式的换行符,你可以做到以下几点:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Write output to another file:
> "CODE_CHECK_2.txt" (
    rem /* Read file by `more` which replaces TABs by SPACEs;
    rem    then parse the output by `for /F` (skipping empty lines): */
    for /F delims^=^ eol^= %%L in ('more "CODE_CHECK.txt"') do (
        rem // Store current (non-empty) line:
        set "LINE=%%L"
        rem /* Toggle delayed expansion to be able to write and read
        rem    a variable in the same block of code and to preserve `!`: */
        setlocal EnableDelayedExpansion
        rem // Replace every SPACE by nothing, hence remove it:
        echo(!LINE: =!
        endlocal
    )
)
endlocal
exit /B

这是一种保留空行的方法(但仍然存在其余限制):

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Write output to another file:
> "CODE_CHECK_2.txt" (
    rem /* Read file by `more` which replaces TABs by SPACEs;
    rem    precede every line by line number plus `:` to not appear empty;
    rem    then parse the output by `for /F` (which would skip empty lines): */
    for /F "delims=" %%L in ('more "CODE_CHECK.txt" ^| findstr /N "^"') do (
        rem // Store current line:
        set "LINE=%%L"
        rem /* Toggle delayed expansion to be able to write and read
        rem    a variable in the same block of code and to preserve `!`: */
        setlocal EnableDelayedExpansion
        rem // Replace every SPACE by nothing, hence remove it:
        set "LINE=!LINE: =!"
        rem // Remove line number prefix and return result:
        echo(!LINE:*:=!
        endlocal
    )
)
endlocal
exit /B

【讨论】:

    【解决方案2】:

    假设您使用的是 Windows 平台,由于您提供的代码和包含的标签……

    以下 示例将删除空格和制表符,并删除所有空行:

    @If Exist "CODE_CHECK.txt" (For /F Delims^=^ EOL^= %%A In ('More /T1 "CODE_CHECK.txt"')Do @Set "$=%%A"&Call Echo(%%$: =%%)>"CODE_CHECK_2.txt"
    

    要使用 维护任何空白行,您需要更多类似的内容:

    @If Exist "CODE_CHECK.txt" (For /F "Tokens=1*Delims=]" %%A In ('More "CODE_CHECK.txt"^|Find /V /N ""')Do @Set "$= %%B"&Call Echo(%%$: =%%)>"CODE_CHECK_2.txt"
    

    在此示例中,我删除了 More/T1 选项,我不确定它是否或多或少有效


    您也可以使用(如果需要,输入和输出文件可以相同)

    (GC 'CODE_CHECK.txt') -Replace '\s',''|SC 'CODE_CHECK_2.txt'
    

    您也可以从 运行 版本:

    @PowerShell -NoP "(GC 'CODE_CHECK.txt') -Replace ' |\t',''|SC 'CODE_CHECK_2.txt'"
    

    在这个版本中,我使用了' |\t',作为'\s' 的可能替代品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 2011-10-01
      • 2019-11-25
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多