【问题标题】:Remove txt lines with Batch program使用批处理程序删除 txt 行
【发布时间】:2015-09-17 09:27:18
【问题描述】:

如何删除 txt 上名为“0 Files Copied”的行及其下方的行(带有日期和时间)

基本上它会删除日志文件中的垃圾。

有编辑:

findstr /v /i /c:"0 File(s)" Backuper_log.txt > Backuper_log2.txt
type Backuper_log2.txt > Backuper_log.txt
del Backuper_log2.txt
exit

【问题讨论】:

  • 到目前为止你尝试过什么?我们不是一个免费的代码生成社区。首先表现出一些努力!
  • 好吧对不起……这不是恶意。
  • 其他用户应该如何知道您希望代码做什么?请提供输入和输出文件的样本;并删除标签ms-dos,因为它不适用(我很确定你在 Windows 上工作);

标签: windows file batch-file


【解决方案1】:

您可以使用带有 /V 参数的 FIND 命令,例如

find /V "0 Files Copied" log.txt > log2.txt

但这只会删除带有“0 Files Copied”的行;此命令不允许您删除后面的行。

您也可以使用 FINDSTR,它允许搜索正则表达式。

findstr /V /R /C:"^0 Files Copied$" log.txt > log2.txt

您还可以使用 findstr 使用适当的正则表达式独立删除带有日期的行。

a way 可以使用 findstr 搜索多行,但此方法不适用于 /V 选项,因为仅过滤了匹配的第一行。所以你不能使用 findstr 来删除匹配的行和下一行。

如果您确实需要这样做,我认为您最好的选择是使用一些alternative of grep for Windows

您还可以通过以下简单脚本使用 Powershell。只需将其复制并粘贴到 powershell 命令行中,然后按两次 Enter 即可开始执行。确保输入文件在您的当前文件夹中。

$Lines = Get-Content "input.log"
for ($num = 0; $num -lt $lines.Count; $num++ ) {
    if ($Lines[$num] -match "0 Files Copied") {
        $num++; #skip next line
        continue
    }
    if ($num -match 0) {
        $Lines[$num] > "output.log" }
    else {
        $Lines[$num] >> "output.log" }
}

【讨论】:

  • 因此无法检测到某个“行”的下一行。但如果它检测到某个日期等于上线?类似的东西:2015-09-17 9:42:05,10(下一行:) 2015-09-17 9:42:06,35
  • 我认为 findstr 不可能,但我已经更新了我的答案,以展示如何在 Powershell(win7 及更高版本提供)中执行您想要的操作。
  • 伙计,有一个问题...我在 Powershell 上尝试过,我用 5 行进行了测试,它只给了我一个:postimg.org/image/4z88axx5f
  • 在您的示例中,确切的字符串是“0 File(s) Copied”,s 周围有括号。我不太明白您用于测试的哪 5 行,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多