我每天都在捕获一个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循环,但我在这方面有点像菜鸟。
答案 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使这个脚本对所有对命令解释器有特殊意义的字符都很健壮,而不会丢失它们。