Если кто-то может запускать произвольные команды от имени пользователя root, он может переключиться на любую учетную запись пользователя, чтобы он мог делать все, что может делать этот пользователь.
На практике у вас есть три варианта.
sudo apt-get install…
) часто позволяет экранировать оболочку, вводя команды внутри пакета (это может быть нормально, если сигнатуры пакетов проверены должным образом из известных источников). echo '#EXTM3U';grep -v ^#EXTM3U m3u |sed 'N;s/\n/ /'|sed -e 's/\(.*\)\(http.*\)$/\2\n\1/'|tac
Я бы распечатал заголовок, поменял местами строки в каждой паре, а затем все полностью изменил:
{ head -n 1; { sed -n 'h;n;G;p' | tac; } ; } < infile
Попробуйте tail -r
, если tac
недоступен в вашей системе. Кроме того, в некоторых настройках это не сработает, потому что их голова
тупая, а не соответствует стандартам - другой быстрый способ сделать это - через sed q
:
{ sed q; { sed -n 'h;n;G;p' | tail -r; } ; } < infile
Есть более короткое решение, без 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
Использование 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 в том, что он поддерживает Unicode из -из -в поле -, поэтому приведенный выше код Raku должен иметь возможность обрабатывать как m3u
, так иm3u8
(списки воспроизведения Unicode )с никаких трудностей.
Не обращая внимания на первую строку (" #EXTM3U
" )на данный момент, код Раку довольно прямолинеен -. Строки в (читаются лениво ),rotor
-объединяются парами, упорядочены в обратном порядке -и печатаются с символом новой строки \n
в -между каждой парой.
[Единственное, что нужно помнить с rotor
, это то, что он будет молча удалять элементы в конце, если #элементов (недостаточно, например. строки )для завершения rotor
«набора». Если вы хотите сохранить неполные «наборы» в конце, используйте batch
вместо rotor
].
Ах да, насчет начальной #EXTM3U
строки :в Раку, наверное, проще всего вставить вызов .skip(1)
после lines
, но до .rotor
, и добавить эту строку #EXTM3U
обратно вручную в конец.