Как удалить строки, начинающиеся с определенных строк
Есть ли способ удалить строки, начинающиеся с определенных строк.
У меня есть этот код YouTube-DL
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E
и его результат такой
[youtube:playlist] PL1C815DB73EC2678E: Downloading webpage
[download] Downloading playlist: Less than 1 minute
[youtube:playlist] playlist Less than 1 minute: Collected 4 video ids (downloading 4 of them)
[download] Downloading video 1 of 4
[youtube] KNLwsqzFfNg: Downloading webpage
[youtube] KNLwsqzFfNg: Extracting video information
[youtube] KNLwsqzFfNg: Downloading DASH manifest
[download] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a
[download] 0.4% of 231.51KiB at 6.10KiB/s ETA 00:30
[download] 1.1% of 231.51KiB at 27.07KiB/s ETA 00:10
[download] 4.0% of 231.51KiB at 19.24KiB/s ETA 00:04
[download] 6.5% of 231.51KiB at 75.06KiB/s ETA 00:03
[download] 13.4% of 231.51KiB at 98.22KiB/s ETA 00:03
[download] 28.7% of 231.51KiB at 81.40KiB/s ETA 00:02
[download] 61.7% of 231.51KiB at 91.56KiB/s ETA 00:01
[download] 86.2% of 231.51KiB at 82.96KiB/s ETA 00:00
[download] 100.0% of 231.51KiB at 73.21KiB/s ETA 00:00
[download] 100% of 231.51KiB in 00:02
[ffmpeg] Correcting container in "_1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a"
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
[avconv] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.mp3
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
Deleting original file _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a (pass -k to keep)
[download] Downloading video 2 of 4
[youtube] wTvXkMpJflk: Downloading webpage
[youtube] wTvXkMpJflk: Extracting video information
[youtube] wTvXkMpJflk: Downloading DASH manifest
Я хочу удалить все строки, начинающиеся с [youtube]
, [ffmpeg]
а также [avconv]
и получить как это
[youtube:playlist] PL1C815DB73EC2678E: Downloading webpage
[download] Downloading playlist: Less than 1 minute
[youtube:playlist] playlist Less than 1 minute: Collected 4 video ids (downloading 4 of them)
[download] Downloading video 1 of 4
[download] Destination: _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a
[download] 0.4% of 231.51KiB at 6.10KiB/s ETA 00:30
[download] 1.1% of 231.51KiB at 27.07KiB/s ETA 00:10
[download] 4.0% of 231.51KiB at 19.24KiB/s ETA 00:04
[download] 6.5% of 231.51KiB at 75.06KiB/s ETA 00:03
[download] 13.4% of 231.51KiB at 98.22KiB/s ETA 00:03
[download] 28.7% of 231.51KiB at 81.40KiB/s ETA 00:02
[download] 61.7% of 231.51KiB at 91.56KiB/s ETA 00:01
[download] 86.2% of 231.51KiB at 82.96KiB/s ETA 00:00
[download] 100.0% of 231.51KiB at 73.21KiB/s ETA 00:00
[download] 100% of 231.51KiB in 00:02
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
WARNING: Your copy of avconv is outdated, update avconv to version 10-0 or newer if you encounter any errors.
Deleting original file _1 min. - Amendes pour les particules du LHC-KNLwsqzFfNg.m4a (pass -k to keep)
[download] Downloading video 2 of 4
etc..
etc..
.
.
я попробовал этот метод, но он показывает ошибку, и он только для удаления [youtube]
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | sed '^/[youtube]/ d'
5 ответов
sed -i '/\[youtube\]/d' /path/to/file
удалит строки, содержащие "[youtube]".
Как одна команда вы можете объединить шаблоны, такие как
sed -i '/\[youtube\]\|\[ffmpeg\]\|\[avconv\]/d' /path/to/file
Или прямо из вашей команды
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 \
https://www.youtube.com/playlist?list=PL1C815DB73EC2678E |
sed '/\[youtube\]\|\[ffmpeg\]\|\[avconv\]/d' > output.txt
Это запишет результат в файл output.txt.
Если вы хотите удалить строки, не только содержащие [youtube]
, но начиная с [youtube]
, затем добавьте ^
к шаблону, как sed '/^\[youtube\]/d'
,
Но в вашем случае это не имеет значения.
Я предлагаю использовать grep -vE
вот так:
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | grep -vE '^\[(youtube|ffmpeg|avconv)\]'
От man grep
:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v
is specified by POSIX.)
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below). (-E is specified by POSIX.)
Флаг -E используется, чтобы избежать использования квадратных скобок с косой чертой. Без флага -E вы должны выходить из квадратных скобок с обратной косой чертой, вот так grep -vE '\[youtube\]\|\[ffmpeg\]\|\[avconv\]'
Редактировать:
Так как вы просили awk
вот один с awk
:
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | awk '{if ($0~/^\[youtube\]/||/^\[ffmpeg\]/||/^\[avconv\]/||/^WARNING/) next;print}'
Использование grep -v
следующим образом:
youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | grep -v '^[youtube]' | grep -v '^[ffmpeg]' | grep -v '^[avconv]'
Использование Perl:
< inputfile perl -pe 's/^\[(youtube|ffmpeg|avconv)\].*$//' > outputfile
Для разбора вывода youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E
направьте свой вывод в команду, не перенаправляя содержимое inputfile
:
`youtube-dl --extract-audio --audio-quality 0 --newline --audio-format mp3 https://www.youtube.com/playlist?list=PL1C815DB73EC2678E | perl -pe 's/^\[(youtube|ffmpeg|avconv)\].*$//' > outputfile`
< inputfile
: перенаправляет содержимоеinputfile
вperl
"sstdin
> outputfile
: перенаправляет содержимоеperl
"sstdout
вoutputfile
-p
: местаwhile (<>) { [...] }
зацикливать сценарий и печатать каждую обработанную строку-e
: читает скрипт из аргументов
Разбивка скрипта Perl:
s
: подтверждает выполнение замены/
: запускает шаблон^
: соответствует началу строки\[
: соответствует[
персонаж(
: начинает группировать разрешенные строкиyoutube
: соответствуетyoutube
строка|
: отделяет вторую разрешенную строкуffmpeg
: соответствуетffmpeg
строка|
: отделяет третью допустимую строкуavconv
: соответствуетavconv
строка)
: перестает группировать разрешенные строки\]
: соответствует]
персонаж.*
: соответствует любому числу любого символа$
: соответствует концу строки/
: останавливает шаблон / запускает строку замены/
: останавливает строку замены
Вот аналогичный вопрос с простым ответом
https://askubuntu.com/questions/1493280/remove-lines-from-a-txt-file-that-start-with-a-special-string?noredirect=1#comment2616486_1493280