Соответствие строке, содержащей теги регулярных выражений

Существует обновленное объяснение . Заявленные преимущества включают:

  • Разрешен запуск некоторых вещей только по мере необходимости, таких как XWayland или служба смарт-карт
  • Применение ограничений ресурсов к памяти и ЦП для служб.

Для тех, кто уже знаком с systemd, это означает более стандартизированный и последовательный способ выполнения таких действий, как запуск, остановка и отключение служб, установка переменных среды для приложений, а также просмотр и управление журналами для определенных служб.

Лично я не был знаком с тем, как раньше управлялись все части сеанса Gnome, но я знаком с systemd, так что это облегчит понимание моего рабочего стола и управление им.

0
25.11.2020, 01:34
1 ответ

Кажется, вы делаете это очень окольным путем, используя слишком много совпадений с регулярными выражениями.

А что насчет этого?

#!/bin/bash

shopt -s nullglob

for video in *.mkv *.webm *.mp4; do
        name=${video%.*}

        set -- "$name".*.vtt
        if [ -e "$1" ]; then
                lang=${1#$name.}
                lang=${lang%.vtt}

                mkvmerge -o "subs$name.mkv" "$video" --language "0:$lang" "$1"
        fi
done

Это предполагает, что вы хотите использовать первый файл .vtt, найденный для данного $name(, если существует несколько файлов .vtt, например. для многих языков ).

Цикл перебирает все имена, соответствующие любому из трех шаблонов *.mkv, *.webmи *.mp4.Таким образом, вам не нужно проверять свою переменную цикла на соответствие этим суффиксам, чтобы выяснить, соответствует ли она какому-либо из них.

Учитывая имя файла в $video, часть имени затем извлекается путем простого удаления суффикса имени файла, каким бы он ни был. Это дает нам $name.

С помощью setмы сопоставляем шаблон "$name".*.vtt. Если этот шаблон соответствует хотя бы одному имени файла, то это имя файла будет в $1, и мы извлечем из него языковую часть (бит, который соответствует *в шаблоне ), удалив $name.из спереди, а затем .vttс конца совпадающего имени файла.

Затем мы вызываем mkvmergeс необходимой информацией. Мы не вызываем mkvmerge, если не было .vttфайла (, который, по-видимому, делает ваш код ).

Также обратите внимание, что если есть несколько файлов с одинаковым именем перед суффиксом имени файла, например. thing.mp4и thing.mkv, то они приведут к идентичным mkvmergeкомандам с тем же -oименем(substhing.mkv).

Вы можете обойти это, перебирая файлы .vttи затем выбирая наиболее интересующий вас формат видеофайла, соответствующий имени файла .vtt.

Тем не менее, вам ни в коем случае не нужно использовать регулярные выражения для чего-либо из этого.

Ниже приведен вариант, который рассматривает все .vttфайлы для данного имени:

#!/bin/bash

shopt -s nullglob

for video in *.mkv *.webm *.mp4; do
        name=${video%.*}

        sub_opts=()
        for sub in "$name".*.vtt; do
                lang=${sub#$name.}
                lang=${lang%.vtt}

                sub_opts+=( --language "0:$lang" "$sub" )
        done

        if [ "${#sub_opts[@]}" -gt 0 ]; then
                mkvmerge -o "subs$name.mkv" "$video" "${sub_opts[@]}"
        fi
done
1
18.03.2021, 22:47

Теги

Похожие вопросы