批处理 - 删除包含管道的行

时间:2016-09-27 10:48:05

标签: batch-file cmd

我有几个文本文件,其中每一行以组代码开头,每个数据项由管道符号分隔。有一个特定的组有时会有数据,有时没有数据,因此只有组代码和管道。我试图删除没有数据的这些组,同时保留那些有数据的组。

例如,我文件中的两行如下所示:

A01|ABC|123|XYZ|
A05|123456789||
A05|||
A01|DEF|456|UVW|
A05|987654321||
A05|||
A08|SOMEDATA|

我希望它看起来像

A01|ABC|123|XYZ|
A05|123456789||
A01|DEF|456|UVW|
A05|987654321||
A08|SOMEDATA|

我试过使用findstr,如下所示:

type MYFILE.txt | findstr /v "A05|||" > MYFILE.txt

然而,这是删除文件中的所有内容,而不仅仅是包含A05 |||

的行

2 个答案:

答案 0 :(得分:2)

尝试使用其他文件:

FindStr/RV "^A05||" MyFile.txt>AnotherFile.txt

然后,如果需要 del ete Myfile.txt & ren ame AnotherFile.txt MyFile.txt

答案 1 :(得分:1)

您几乎就在那里,但命令行中存在两个问题:

type MYFILE.txt | findstr /v "A05|||" > MYFILE.txt
  1. 重定向> MYFILE.txt应用于整个命令行,因此在准备重定向时,首先创建(新)空文件MYFILE.txt,然后执行命令行。为避免这种情况,请将输出重定向到另一个文件,然后将其移到原始文件上。
  2. 搜索字符串仅匹配以A05开头的行,但不匹配A06|||之类的行。要匹配此类行,请将搜索字符串更改为|||$$将匹配结束到结尾)。如果字段数量可能有所不同,您可以使用以下代码:^[^|]*|*$(表示除|以外的任意数量的字符作为组代码,后跟任意数量的相邻|; { {1}}在开始时将匹配锚定到行的开头;与将匹配锚定到结尾的^一起,它强制整行以匹配给定的模式。)
  3. 因此,更正的命令行如下所示:

    $

    或者,使用可变数量的字段的替代搜索字符串:

    type "MYFILE.txt" | findstr /V "|||$" > "MYFILE.txt.tmp" & move /Y "MYFILE.txt.tmp" "MYFILE.txt" > nul
    

    仅插入文件路径/名称周围的引号以产生更通用的语法,即使出现空格或其他有毒字符,也不会失败。