提取BAT中的部分文本文件

时间:2016-06-29 09:00:19

标签: batch-file for-loop

我每天都在捕获一个m3U文件,但希望将其中的一部分解析为另一个文件,只需要我需要的几个频道。

例如,我已将m3U重命名为Test.txt文件,该文件具有以下虚构结构:

#EXTINF:0,ABC  
#live link 1
#EXTINF:0,XYZ   
#live link 2
#EXTINF:0,UVW  
#live link 3

我想抓住说出“#EXTINF:0,XYZ”的线条并说出它下面的一行,最后输出一个Output.txt,如下所示:

#EXTINF:0,XYZ   
#live link 2

我知道需要使用For循环,但我在这方面有点像菜鸟。

2 个答案:

答案 0 :(得分:1)

将此代码放入文件filter.cmd。

filter.cmd input_file.m3u XYZ > output_file.m3u

使用示例:

var self = this;
self.show = function() {
    $http.get('/contactlist').success(function(response) {
        console.log(response);
        return response;
    });

以下是一些解释:
每个输入行都使用for / f与标记和delim进行拆分。 如果行以#EXTINF开头并且其余部分包含要匹配的字符串(第二个参数),则设置MATCHED。 如果设置了MATCHED,则输出行直到下一个#EXTINF。

答案 1 :(得分:0)

我会这样做,假设.m3u文件在前面有#EXTINF的行中不包含尾随空格,就像您的示例数据一样:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "FILE=%~1"
set "HEADER=#EXTM3U"
set "PREFIX=#EXTINF"
set "MATCH=%~2"

set "FLAG="
for /F usebackq^ delims^=^ eol^= %%L in ("%FILE%") do (
    if defined FLAG (
        echo(%%L
        set "FLAG="
    )
    for /F "delims=:" %%P in ("%%L") do (
        if "%%P"=="%HEADER%" (
            echo(%%L
        ) else if "%%P"=="%PREFIX%" (
            set "LINE=%%L"
            setlocal EnableDelayedExpansion
            if /I "!LINE:*,=!"=="!MATCH!" (
                echo(!LINE!
                endlocal
                set "FLAG=#"
            ) else endlocal
        )
    )
)

endlocal
exit /B

像这样调用脚本,假设它保存为extract-entry.bat

extract-entry.bat "input_file.m3u" "XYZ" > "output_file.m3u"

脚本逐行遍历给定的.m3u文件。它返回未编辑的当前行并重置变量FLAG,如果设置了变量FLAG,则开头不是这种情况。

然后它会查找#EXTINF。如果找到(例如,#EXTINF:0,XYZ),则将逗号(XYZ)之后的字符串与给定的搜索字符串进行比较。如果匹配,则输出当前行并立即设置FLAG变量以获得以下行。

始终输出标题行#EXTM3U

切换delayed expansion使这个脚本对所有对命令解释器有特殊意义的字符都很健壮,而不会丢失它们。