텍스트 파일(m3u 재생 목록)의 줄 쌍 순서를 바꾸고 싶습니다.
m3u 파일의 원본 내용은 다음과 같습니다.
#EXTM3U
#EXTINF:-1,AL: Klan HD (AL)
http://mydomain.org:8000/live/username/mypass/1.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/8.ts
다음과 같이 뒤집어야 합니다.
#EXTM3U
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/8.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan HD (AL)
http://mydomain.org:8000/live/username/mypass/1.ts
나는 이미 이것을 가지고 있습니다:
http://mydomain.org:8000/live/username/mypass/8.ts
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/1.ts
#EXTINF:-1,AL: Klan HD (AL)
#EXTM3U
하지만 그것은 나에게 필요한 것이 아닙니다.
답변1
헤더를 인쇄하고 각 쌍의 줄을 바꾼 다음 전체를 반대로 합니다.
{ head -n 1; { sed -n 'h;n;G;p' | tac; } ; } < infile
tail -r
tac
귀하의 시스템에서 사용할 수 없는 경우 시도해 보십시오. 또한 일부 설정에서는 head
멍청하고 작동하지 않기 때문에 작동하지 않습니다.기준을 충족하지 않습니다.- 또 다른 빠른 방법은 다음과 같습니다 sed q
.
{ sed q; { sed -n 'h;n;G;p' | tail -r; } ; } < infile
답변2
echo '#EXTM3U';grep -v ^#EXTM3U m3u |sed 'N;s/\n/ /'|sed -e 's/\(.*\)\(http.*\)$/\2\n\1/'|tac
답변3
더 짧은 해결책이 있습니다. 그러나 다음 과 tac
같습니다 .head
sed
$ head -n 1 f;sed -n '1!{N;2,3!G;h;$p}' f;
#EXTM3U
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/8.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan HD (AL)
http://mydomain.org:8000/live/username/mypass/1.ts
답변4
Raku(이전 Perl_6) 사용
raku -e '.join("\n").put for lines.rotor(2).reverse;'
입력 예:
#EXTINF:-1,AL: Klan HD (AL)
http://mydomain.org:8000/live/username/mypass/1.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/8.ts
예제 출력:
#EXTINF:-1,AL: TV Uskana
http://mydomain.org:8000/live/username/mypass/8.ts
#EXTINF:-1,AL: Top Channel Beckup
http://mydomain.org:8000/live/username/mypass/7.ts
#EXTINF:-1,AL: Top Channel HD
http://mydomain.org:8000/live/username/mypass/6.ts
#EXTINF:-1,AL: Top Channel SD
http://mydomain.org:8000/live/username/mypass/5.ts
#EXTINF:-1,AL: Klan Kosova (B)
http://mydomain.org:8000/live/username/mypass/4.ts
#EXTINF:-1,AL: Klan Kosova
http://mydomain.org:8000/live/username/mypass/3.ts
#EXTINF:-1,AL: Klan HD Beckup
http://mydomain.org:8000/live/username/mypass/2.ts
#EXTINF:-1,AL: Klan HD (AL)
http://mydomain.org:8000/live/username/mypass/1.ts
Raku의 좋은 점은 기본적으로 유니코드를 지원하므로 위의 Raku 코드는 m3u
및 (유니코드 재생 목록)을 문제 없이 처리할 수 있어야 한다는 것입니다.m3u8
#EXTM3U
일단 첫 번째 줄("")을 무시하면 Raku 코드는 매우 간단합니다. 행은 쌍으로(느리게) 읽고 rotor
역순으로 정렬되며 \n
각 쌍 사이에 개행 문자가 인쇄됩니다.
[기억해야 할 유일한 점 rotor
은 "세트"를 완료하는 데 필요한 요소(예: 행)가 충분하지 않은 경우 rotor
마지막에 자동으로 요소를 제거한다는 것입니다. 끝부분에 불완전한 "세트"를 유지하려면 ] batch
대신 사용하세요 rotor
.
아, 첫 번째 줄에 대해: Raku에서 가장 쉬운 방법은 아마도 #EXTM3U
after but before에 호출을 삽입하고 끝에 수동으로 줄을 추가하는 것입니다..skip(1)
lines
.rotor
#EXTM3U