텍스트 파일의 줄 쌍 순서를 반대로 바꿉니다.

텍스트 파일의 줄 쌍 순서를 반대로 바꿉니다.

텍스트 파일(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 -rtac귀하의 시스템에서 사용할 수 없는 경우 시도해 보십시오. 또한 일부 설정에서는 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같습니다 .headsed

$ 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에서 가장 쉬운 방법은 아마도 #EXTM3Uafter but before에 호출을 삽입하고 끝에 수동으로 줄을 추가하는 것입니다..skip(1)lines.rotor#EXTM3U

https://raku.org

관련 정보