【问题标题】:Delete certain lines in a txt file via a batch file通过批处理文件删除txt文件中的某些行
【发布时间】:2009-01-07 01:59:41
【问题描述】:

我有一个生成的 txt 文件。该文件有一些多余的行,需要删除。需要删除的每一行在该行中有两个字符串之一; “错误”或“参考”。这些标记可能出现在行中的任何位置。我想删除这些行,同时保留所有其他行。

那么,如果 txt 文件看起来像这样:

良好的数据线 C:\Directory\ERROR\myFile.dll 的坏行 另一个很好的数据线 坏行:参考 好线

我希望文件以这样的方式结束:

良好的数据线 另一个很好的数据线 好线

TIA。

【问题讨论】:

    标签: string batch-file


    【解决方案1】:

    使用以下内容:

    type file.txt | findstr /v ERROR | findstr /v REFERENCE
    

    这具有在 Windows 操作系统中使用标准工具的优势,而不必查找和安装 sed/awk/perl 等。

    查看下面的运行记录:

    C:\>输入文件.txt 良好的数据线 C:\Directory\ERROR\myFile.dll 的坏行 另一个很好的数据线 坏行:参考 好线 C:\>输入文件.txt | findstr /v 错误 | findstr /v 参考 良好的数据线 另一个很好的数据线 好线

    【讨论】:

    • 太好了,正是我要找的那条线。
    • 有这个确切的问题,并在 SO 上找到它。上帝保佑 Stack Overflow!!
    • 完整:您需要添加 "> output.txt"(不带引号)以将输出写入文件。
    • 谢谢,这对我有帮助,但请注意,我在使用包括空格在内的短语时遇到了一些问题,必须使用 /c: 所以命令看起来像这样: type file.txt | findstr /v /c:"错误" | findstr /v /c:“参考”。此外,如果您需要删除您知道位于文件顶部的行,请将其通过 more + 管道,其中 是要删除的行数。
    • 如果我写 type test.java | findstr /v "ECHO is on." > test.java,为什么它会删除我的文件 test.java 中的所有内容,但是如果我将它写入像 type test.java | findstr /v "ECHO is on." > test2.java 这样的新文件,它会执行预期的操作
    【解决方案2】:

    您可以单独使用 findstr 来完成与 @paxdiablo 相同的解决方案。无需将多个命令连接在一起:

    findstr /V "ERROR REFERENCE" infile.txt > outfile.txt
    

    这是如何工作的详细信息:

    • /v 查找与搜索字符串不匹配的行(@paxdiablo 使用相同的开关)
    • 如果搜索字符串在引号中,它会使用每个单词执行 OR 搜索(分隔符是空格)
    • findstr 可以获取输入文件,您无需使用“type”命令向其输入文本
    • "> outfile.txt" 会将结果发送到文件 outfile.txt,而不是将它们打印到您的控制台。 (请注意,如果文件存在,它将覆盖文件。如果要追加,请改用“>> outfile.txt”。)
    • 您还可以考虑添加 /i 开关以进行不区分大小写的匹配。

    【讨论】:

    • 输入 !INSTALLED_APPS! | findstr /v "@ //" > temp_filter_out_junk.txt >nul 2>&1
    • 我试过这个type D:/e5/datastream/package.json | findstr /v eikon-framework | findstr /v df-core 但它没有删除行
    • 我试过 findstr /V "eikon-framework df-core" D:\e5\datastream\package.json > D:\e5\datastream\package.json 但如果我删除所有内容尝试替换同一文件中的数据,如果我使用不同的输出文件名,那么它可以工作。如何更新同一个文件?
    • @kittu 使用“>>”而不是“>”。从答案:如果要追加,请改用“>> outfile.txt”。您不能在该单个命令中更改同一个文件。
    • 既然问题是关于在文件中替换,那么如何更改当前文件?我尝试的一切都导致文件为空
    【解决方案3】:

    如果你有 sed:

    sed -e '/REFERENCE/d' -e '/ERROR/d' [FILENAME]
    

    FILENAME 是带有好坏行的文本文件的名称

    【讨论】:

    • 你不需要-i 标志吗?
    【解决方案4】:

    如果您安装了 perl,那么 perl -i -n -e"print unless m{(ERROR|REFERENCE)}" 应该可以解决问题。

    【讨论】:

      【解决方案5】:

      似乎使用FIND 而不是FINDSTR 也可以支持Unicode 字符。 例如type file.txt | find /v "Ω"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 2015-04-05
        相关资源
        最近更新 更多