使用find,trim lead和trail space提取多行

Dou*_*tes 3 trim batch-file find

之前的问题是从文本文件中提取多行,现在工作正常,但它仍然需要一些改进来修剪前导和尾随(棘手的部分)空格/制表符空间以及通过Stackoverflow搜索我找到了很多答案并让我结合起来我最后的批处理脚本,但是从所有人把它放在一起它可能不是那么正确.

Details.txt(源文件)

line not needed, Copy and help with these command prompt:
line not needed:
(whitespace)(whitespace)some text not needed Copy "c:\.." a b c(white space)
line not needed:
line not needed, Copy and help with these command prompt:
(whitespace)Copy "d:\.." a c c(tab space)
line not needed
(tab space)(tab space)Copy "e:\.." a a c(whitespace)
line not needed
Run Code Online (Sandbox Code Playgroud)

op.txt(输出文件)

Copy "c:\.." a b c
Copy "d:\.." a c c
Copy "e:\.." a a c
Run Code Online (Sandbox Code Playgroud)

让我们看看第一个批处理脚本.(没有修剪引线和轨迹空间)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET source="details.txt"
IF EXIST %source% (
  FIND /i "copy " <%source% |FIND "\" >op.txt
) ELSE (
  Exit
)
Run Code Online (Sandbox Code Playgroud)

组合脚本和尾迹空间的组合脚本给了我两个输出(不是很大).但是,如果我们可以在输出和代码中缩短它,那将是很好的.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET source="details.txt"
IF EXIST %source% (
  FIND /i "copy " <%source% |FIND "\" >op.txt
  >op2.txt (
    FOR /f "delims=" %%A IN (op.txt) DO (
      SET "ln=%%A"
      SET str=!ln:*Copy=Copy!
      FOR /l %%b IN (1,1,31) DO (
        IF "!str:~-1!"==" " SET str=!str:~0,-1!
        IF "!str:~-1!"=="   " SET str=!str:~0,-1!
      )
      ECHO !str!
    )
  )
) ELSE (
  Exit
)
Run Code Online (Sandbox Code Playgroud)

它实际上适用于我的大多数源文件,但我确信这可能编码不好.所以我想要在某些方面改进这个批处理脚本,比如输出或者更短/更简单的版本.

谢谢,foxidrive开始并帮助解决我的第一个问题.

David的更新版本(现在所有输出)

@ECHO OFF
SETLOCAL
SET "sourceFile=details.txt"
SET "outputFile=opDavid.txt"
@ECHO OFF > "%outputFile%"
IF EXIST "%sourceFile%" FOR /f "delims=" %%A IN ('FIND /i "copy " ^<%sourceFile% ^|FIND "\"') DO CALL :Trim %%A >>%outputFile%
ENDLOCAL
EXIT /b 0

:Trim
ECHO(%*
EXIT /b 0
Run Code Online (Sandbox Code Playgroud)

对不起我的英文,它像我的编码一样糟糕

Dav*_*ann 5

这将做你想要的,但有限制.

  • 以下"有毒"字符不得出现在字符串中:| <>&^%

Trim例程通过使用该call命令修剪任何前导和尾随空格来工作.

@ECHO OFF
SETLOCAL
SET "source=details.txt"
SET "output=op.txt"
@echo off > "%output%"
IF EXIST "%source%" FOR /f "delims=" %%A in ('FIND /i "copy " ^<%source% ^|FIND "\"') do call :Trim %%A >> "%output%"
ENDLOCAL
EXIT /b 0

:Trim
echo(%*
EXIT /b 0
Run Code Online (Sandbox Code Playgroud)

更新以回答评论中的问题

  • 限制原因:
    • | < > &除非在引号内或正确转义,否则会导致脚本崩溃^.
    • ^ 将被除去字符串,除非在引号内,因为它是转义字符除非它本身被转义.
    • %即使在引号内也将从字符串中删除,因为它是变量char,除非它本身被转义%%.
    • 请注意,每次cmd解析它们时,每个角色都必须被转义,这可能会成为一个主要的痛苦.
    • 批特殊字符
  • 还有其他复杂情况需要了解cmd的工作原理. 阅读这些答案!

请注意,大多数这些限制都可以处理,但它需要多行代码,然后可能仍然存在一些限制. 请参阅我的FindAndReplace.bat概念证明,了解它将需要什么.

引号围绕变量,值set "var=value"可以提供特殊的字符保护,而无需在值本身中加引号.

  • 我的一般批处理字符串规则(我相信批处理社区同意):避免使用变量值中的引号和引用变量.

这可以防止变量具有引号并且在引号中的情况.以下将失败,因为

set var="value with spaces"
if "%var%"="value with spaces"
:: this becomes
if ""value with spaces""="value with spaces"
Run Code Online (Sandbox Code Playgroud)

ENDLOCALSETLOCAL命令关闭范围,因此,清除对环境所做的所有更改.请参阅本参考