批处理文件来查找一个单词,提取该单词上方的两行并将其写入不同的文本文件中

批处理文件来查找一个单词,提取该单词上方的两行并将其写入不同的文本文件中

在我的场景中,我需要检查我的文件(XXX.txt)中是否有““。文件中的单词。

现在我需要一个脚本来编写“”单词,新建一个文本框,命名为“ done.txt”。

例子XXX.txt

dfsfs
clip_id HDX
title Setiap hari
type PROMO
end
clip_id HDQ
title Citra
type SPOT
end
clip_id HDX
title Ri
type PROMO
end
clip_id HDX
title sni
type SPOT

所以我需要done.txt按照下面写“”。

clip_id HDQ
title Citra

clip_id HDX
title sni

请提供执行此操作的脚本。

非常感谢

答案1

以下是微软的 cmd 继任者 Powershell 中的解决方案:

# variables that you need to set
$source = "C:\temp\superuser.txt"
$destination = "C:\temp\done.txt"

#region easier to understand for PS newcomers
$hits = select-string -Path $source -SimpleMatch "SPOT" -CaseSensitive
$filecontents = get-content $source

foreach($hit in $hits)
{
    $filecontents[$hit.linenumber-3] | out-file -append $destination
    $filecontents[$hit.linenumber-2] | out-file -append $destination
    "" | out-file -append $destination
}
#endregion


#region shorter version
$hits = select-string -Path $file -SimpleMatch "SPOT" -CaseSensitive -context 2

foreach($hit in $hits)
{
    $hit.context.PreContext | out-file -append $destination
    "" | out-file -append $destination
}
#endregion

答案2

我强烈推荐JREPL.BAT - 执行正则表达式文本替换的混合 JScript/批处理实用程序。JREPL.BAT 是纯脚本,可​​以在 XP 及更高版本的任何 Windows 平台上本地运行。

假设 JREPL.BAT 位于您当前的目录中,或者更好的是,位于 PATH 中的某个位置,那么一个简单的命令行单行代码就可以有效地解决您的问题:

jrepl "^((.*\n){2})type SPOT$" $1 /m /jmatch /f xxx.txt /o done.txt
  • 多行选项/M允许跨换行符进行搜索。
  • /JMatch选项仅打印匹配的替换字符串

由于 JREPL 是一个批处理脚本,因此如果在另一个脚本中使用它,则必须使用 CALL JREPL。

使用 可以从命令行获取完整文档jrepl /?。您可能希望使用jrepl /?|more一次查看一页帮助。我从不使用 MORE,因为我的 cmd.exe 控制台窗口配置了一个大的输出缓冲区,使我能够向上滚动以查看过去的输出。

相关内容