3

之前的问题是从文本文件中提取多行,现在工作正常,但它仍然需要一些改进来修剪前导和尾随(棘手的部分)空格/制表符空格,并且通过 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

op.txt(输出文件)

Copy "c:\.." a b c
Copy "d:\.." a c c
Copy "e:\.." a a c

让我们看看第一个批处理脚本。(没有修剪前导和尾随空间)

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

修剪前导和尾随空间的组合脚本给了我两个输出(没什么大不了的)。但是,如果我们可以在输出和代码上都缩短它,那就太好了。

@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
)

它实际上适用于我的大多数源文件情况,但我确信这可能没有很好的编码。所以我想要求以某种方式改进这个批处理脚本,比如输出或者更短/更简单的版本。

谢谢, 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

对不起我的英语,就像我的编码一样糟糕

4

3 回答 3

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

更新以回答评论中的问题

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

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

变量和值周围的引号set "var=value"可以提供特殊的字符保护,而不必在值本身中加上引号。

  • 我的通用批处理字符串规则(并且我相信批处理社区同意):避免在变量值中使用引号并在使用时引用变量。

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

set var="value with spaces"
if "%var%"="value with spaces"
:: this becomes
if ""value with spaces""="value with spaces"

ENDLOCAL关闭命令的范围SETLOCAL,因此,清理对环境所做的所有更改。请参阅此参考

于 2013-10-09T20:44:42.620 回答
2

如果您将两个帮助批处理文件放在路径中,则此命令无需安装任何第三方软件即可工作:

type "source.txt" |repl "^[ \t]*" "" |repl "[ \t]*$" "" |findrepl "copy \x22" /i >op.txt

前两个repl命令删除空格/制表符的前导和尾随空格,该findrepl命令将过滤其中包含copy "的行。

调用的辅助批处理文件repl.bat可以在这里
找到 调用的辅助批处理文件findrepl.bat可以在这里找到

将它们都放在与批处理文件相同的文件夹中,或者放在 c:\windows\system32 或 PATH 语句上的另一个目录中。

于 2013-10-10T03:15:16.143 回答
1

只需尝试sed for Windows

sed "s/^[ \t]*//;s/[ \t]*$//" details.txt
于 2013-10-10T00:49:10.420 回答