Batch file 从文本文件中删除空行

Batch file 从文本文件中删除空行,batch-file,Batch File,我想从文本文件中删除空行。我只是试图找到一个findstr命令行开关来找到解决方案,但我无法让它工作。这是我的档案: test2.html: <script src="common/latest_updates/angular-slider.js"></script> <script src="common/latest_updates//angular-list-group.js"></script> blank space <script

我想从文本文件中删除空行。我只是试图找到一个
findstr
命令行开关来找到解决方案,但我无法让它工作。这是我的档案:

test2.html:

<script src="common/latest_updates/angular-slider.js"></script>
<script src="common/latest_updates//angular-list-group.js"></script>
blank space
<script src="common/latest_updates/jstree/jstree.js"></script>
<script src="common/latest_updates/jstree/ngJsTree.js"></script>
blank space
<script src="common/d3/ngFunnel.js"></script>
findstr /r /v "^$" test2.html >> test3.html

这将遍历源文件
test2.html
,只打印非空的行。结果将写入目标文件
test3.html

@echo off

set "source=test2.html"
set "dest=test3.html"

1>"%dest%" (
  for /f "tokens=1,* delims=:" %%i in ('findstr /n "^" "%source%"') do (
    if not "%%j" == "" (
      echo;%%j
    )
  )
)
为了处理空行(与只包含空格的行相同),将需要更多的处理,但应该可以在正确的时间打开和关闭延迟扩展


使用以下代码克服jeb提到的问题,能够处理行
:comment
/?
。多亏了dbenham的回复


这将遍历源文件
test2.html
,只打印非空的行。结果将写入目标文件
test3.html

@echo off

set "source=test2.html"
set "dest=test3.html"

1>"%dest%" (
  for /f "tokens=1,* delims=:" %%i in ('findstr /n "^" "%source%"') do (
    if not "%%j" == "" (
      echo;%%j
    )
  )
)
为了处理空行(与只包含空格的行相同),将需要更多的处理,但应该可以在正确的时间打开和关闭延迟扩展


使用以下代码克服jeb提到的问题,能够处理行
:comment
/?
。多亏了dbenham的回复


这将处理空行。您的帖子不清楚所示行是否包含空白。如果指示的行包含空格(如空格或制表符),则会变得更加复杂

@echo off
if exist test3.html del test3.html
for /f "tokens=1*" %%a in (Test2.html) do (
    rem If adding a space to the line does not result in a line with only 1 space, output it.
    if not "%%a "==" " (
        echo %%a%%b>>test3.html
    )
)
start "test" notepad.exe test3.html
exit /b

这将处理空行。您的帖子不清楚所示行是否包含空白。如果指示的行包含空格(如空格或制表符),则会变得更加复杂

@echo off
if exist test3.html del test3.html
for /f "tokens=1*" %%a in (Test2.html) do (
    rem If adding a space to the line does not result in a line with only 1 space, output it.
    if not "%%a "==" " (
        echo %%a%%b>>test3.html
    )
)
start "test" notepad.exe test3.html
exit /b

我看到两个可能的原因,为什么FINDSTR命令没有给出您想要的结果

  • 空行可能不是空的,而是包含空格和/或制表符。显然,您的正则表达式与包含空格的行不匹配
  • 该文件可能具有unix格式(行以
    结尾,而不是Windows
    标准)。
    $
    锚只匹配
    之前的位置,因此它永远无法匹配任何使用unix行结尾的行
有关更多信息,请参阅

我将使用以下命令仅匹配至少包含一个非空白字符的行。请注意,
表示硬编码的制表符,而不是字符串文字

findstr /rc:"[^ <tab>]" test2.html >test3.html
findstr/rc:“[^]”test2.html>test3.html
如果在控制台会话中启用了文件完成,则从命令行输入
可能会有点问题。按[TAB]键将尝试完成文件名。解决此问题的一种方法是按住[ALT]键和键盘[9]键,然后松开。输入行上可能会出现一个有趣的字符,但正确的
值将提供给FINDSTR


如果使用批处理脚本,那么输入字符应该没有问题,除非您的文本编辑器将制表符转换为空格。

我发现FINDSTR命令没有给出所需结果的两个可能原因

  • 空行可能不是空的,而是包含空格和/或制表符。显然,您的正则表达式与包含空格的行不匹配
  • 该文件可能具有unix格式(行以
    结尾,而不是Windows
    标准)。
    $
    锚只匹配
    之前的位置,因此它永远无法匹配任何使用unix行结尾的行
有关更多信息,请参阅

我将使用以下命令仅匹配至少包含一个非空白字符的行。请注意,
表示硬编码的制表符,而不是字符串文字

findstr /rc:"[^ <tab>]" test2.html >test3.html
findstr/rc:“[^]”test2.html>test3.html
如果在控制台会话中启用了文件完成,则从命令行输入
可能会有点问题。按[TAB]键将尝试完成文件名。解决此问题的一种方法是按住[ALT]键和键盘[9]键,然后松开。输入行上可能会出现一个有趣的字符,但正确的
值将提供给FINDSTR


如果使用批处理脚本,则输入
字符应该没有问题,除非文本编辑器将制表符转换为空格。

在源文件中出现行时失败,如
:comment
/?
@jeb谢谢您的评论。现在我终于明白了为什么
echo(
echo;
更受欢迎。我在DosTips上找不到更多关于这方面的详细信息。可以在源文件中的Fails中找到描述,如
::comment
/?
@jeb谢谢你的评论。现在我终于明白了
echo的原因(
优先于
echo;
。我在DosTips上找不到有关此的更多详细信息。说明可在
%%找到。a
不能为空,因为在这种情况下/f已跳过。您的解决方案对于以
开头的行失败,对于像
on
/?
“…对于以开头的行失败;对于像ON或/?这样的行失败”-这些行都不在原始post或示例数据中。
%%a不能为空,因为在这种情况下/f已经跳过。对于以
开头的行,解决方案失败;对于像
ON或
/?
这样的行,解决方案失败。”…对于以开头的行失败;对于ON或/?”之类的行失败-这些行都不在原始post或样本数据中。
findstr
的问题在哪里?
findstr
的问题在哪里?这应该是可接受的答案。无需询问