我有几个文本文件,其中每一行以组代码开头,每个数据项由管道符号分隔。有一个特定的组有时会有数据,有时没有数据,因此只有组代码和管道。我试图删除没有数据的这些组,同时保留那些有数据的组。
例如,我文件中的两行如下所示:
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 |||
的行答案 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
> MYFILE.txt
应用于整个命令行,因此在准备重定向时,首先创建(新)空文件MYFILE.txt
,然后执行命令行。为避免这种情况,请将输出重定向到另一个文件,然后将其移到原始文件上。A05
开头的行,但不匹配A06|||
之类的行。要匹配此类行,请将搜索字符串更改为|||$
($
将匹配结束到结尾)。如果字段数量可能有所不同,您可以使用以下代码:^[^|]*|*$
(表示除|
以外的任意数量的字符作为组代码,后跟任意数量的相邻|
; { {1}}在开始时将匹配锚定到行的开头;与将匹配锚定到结尾的^
一起,它强制整行以匹配给定的模式。)因此,更正的命令行如下所示:
$
或者,使用可变数量的字段的替代搜索字符串:
type "MYFILE.txt" | findstr /V "|||$" > "MYFILE.txt.tmp" & move /Y "MYFILE.txt.tmp" "MYFILE.txt" > nul
仅插入文件路径/名称周围的引号以产生更通用的语法,即使出现空格或其他有毒字符,也不会失败。