![](/img/trans.png)
[英]Windows command line/shell - While appending file to another file, how to ignore lines that match a regex?
[英]How to remove lines from File A that are in File B in Windows command shell?
这个问题非常适合加入两个文件。 我需要做相反的事情。 我需要从文件A中删除文件A中的行。
这个问题与其他问题类似,不过该问题适用于unix,这适用于windows命令shell(cmd.exe)。
我想使用Windows 7 Pro原生的工具。
这些文件是主机文件。 每一行都包含以下内容:
127.0.0.1 host.domain.com
要么
0.0.0.0 host.domain.com
要么
# this is a comment
文件最多可包含200,000行。 可能存在空格和制表符。
虽然我更喜欢保留它,但顺序不会影响功能。
以下是主机文件的一些示例:
(对于这个问题,不要担心0.0.0.0
vs'127.0.0.1`。)
findstr /v /x /g:"fileb" "filea">resultfile
查找文件A中的字符串( /v
)与fileb
字符串完全匹配( /x
)。
您没有为此问题提供单一规范! 这些文件可能有特殊字符或空格吗? 他们可能有多少行? 输出文件必须与FileA的顺序相同吗?
根据一系列因素,此解决方案可能有效,也可能无效
@echo off
setlocal
rem Load lines from File A into "fileA" array
for /F "delims=" %%a in (FileA.txt) do set "fileA["%%a"]=1"
rem Remove elements from "fileA" array that are in File B
for /F "delims=" %%b in (FileB.txt) do set "fileA["%%b"]="
rem Show remaining elements
for /F "tokens=2 delims=[]" %%a in ('set fileA[') do echo(%%~a
正如dbenham在评论中指出的那样,有一个带有多个文字搜索字符串的findstr
的错误 - 引用这个帖子: 为什么这个带有多个文字搜索字符串的FINDSTR示例找不到匹配? 。 要解决此问题,您可以在命令提示符中执行以下操作:
copy "fileB" "fileC" & (for /F usebackq^ delims^= eol^= %L in ("fileA") do findstr /V /X /C:"%L" "fileC" > "fileC") & move /Y "fileC" "fileB"
或者在批处理文件中:
copy "fileB" "fileC"
for /F usebackq^ delims^= eol^= %%L in ("fileA") do (
findstr /V /X /C:"%%L" "fileC" > "fileC"
)
move /Y "fileC" "fileB"
该第一拷贝fileB
作为fileC
,然后删除线fileC
匹配的那些fileA
一个接着一个,则替换原始fileB
由修改fileC
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.