覆盖匹配的行

时间:2016-02-02 09:22:17

标签: shell awk ffmpeg

当我将ffmpeg的输出打印到文件时,我得到这样的结果:

frame=*

现在我希望所有与ffmpeg -v info -i input.ext -f null 2>&1 | awk '/frame=/{gsub(/.*/, $0)};{print}'匹配的行都被替换,并且只有最后一行当前行被打印到文本文件中(实时)。

这可能吗?

目前我有这条线:

frame=*

它几乎可以工作,除了包含$PATH = ".\file.xml" $XML = [xml](Get-Content -path $PATH) $NSMGR = New-Object System.Xml.XmlNamespaceManager($XML.NameTable) $NSMGR.AddNamespace("ns", $XML.DocumentElement.NamespaceURI) $XML.selectSingleNode("//ns:component[@name='Microsoft-Windows-Shell-Setup']", $NSMGR) $NEWCHILD = $XML.CreateElement("TESTELEMENT") $NEWCHILD.set_innerXML("TESTTEXT") $XML.save(".\file.xml") 的所有行都是空的。

2 个答案:

答案 0 :(得分:1)

您可以从awk中截断文件,并在每行写入一次,如下所示:

awk '/frame=/ { close("file"); print > "file" }'

在awk中使用>时,它会在写入之前打开并截断文件。随后写入同一文件。如果每次都关闭文件,那么下次写入时它总是会截断它。

答案 1 :(得分:0)

您可以使用此过滤器:

awk '/frame=/{f=$0; next}END{print f}'

它会在frame=中保存最新的行匹配f而不打印它,并在脚本末尾打印保存的值。