non-greedy grep

Я новичок в ffmpeg, но теперь у меня есть небольшой хороший конвертер на VB.NET, который создает необработанные фильмы различных выходных форматов для использования в небольших устройствах, которые имеют доступ к SD карте, но не имеют достаточной мощности для декодирования сложного видео.

Из-за того, как он работает при изменении размера и обрезке, мне пришлось кодировать его вручную и создавать параметры. В основном мне нужно знать результирующую ширину и высоту.

У меня есть 2 флажка для опций :-

Preserve Aspect Ratio (X) Fill All Pixels (X)

В качестве входных данных нужны только 4 переменные (1) Ширина исходного видео, (2) Высота исходного видео, (3) Ширина устройства, (4) Высота устройства.

Несмотря на то, что программа предназначена для VB.NET, она может быть легко адаптирована для любого языка.

    Dim crop As String = "" ' will build this in ffmpeg format for -s or scale and crop

    If cbAspectRatio.Checked = False Then
        m_dest_output_w = sz._w
        m_dest_output_h = sz._h

        ' scale to w * h - simple
        crop = " -s " & m_dest_output_w & ":" & m_dest_output_h
    Else
        Dim ratio As Double = CDbl(m_video_width) / CDbl(m_video_height) ' this is aspect ratio of original unsized video

        If cbFillPixels.Checked = False Then ' shrink to fit
            If sz._w * ratio <= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w / ratio
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h / ratio
            End If

            ' no cropping just resizing to a non-filled area that fits

            crop = " -s " & m_dest_output_w & ":" & m_dest_output_h ' no cropping needed as letterboxed

        Else ' expand / fill --- cropping needed
            If sz._w * ratio >= m_video_height Then
                m_dest_output_w = sz._w
                m_dest_output_h = sz._w * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":0:" & Math.Abs((m_dest_output_h - sz._h)) \ 2
            Else
                m_dest_output_h = sz._h
                m_dest_output_w = sz._h * ratio

                crop = ",crop=" & sz._w & ":" & sz._h & ":" & Math.Abs((m_dest_output_w - sz._w)) \ 2 & ":0"
            End If

            crop = " -vf scale=" & m_dest_output_w & ":" & m_dest_output_h & crop

            m_dest_output_w = sz._w
            m_dest_output_h = sz._h
        End If
    End If
5
05.03.2016, 15:25
3 ответа

Стандартный grep не принимает модификатор ?, который обычно делает его не жадным.

Но вы можете попробовать опцию -P, которая - если она включена в вашем дистрибутиве - заставит его принимать регексы в стиле Perl:

grep -oP -m1 "(https)[^'\"]+?.mp3" mp3.txt

Если это не сработает, вы можете для вашего конкретного примера включить правую скобку в диапазон, чтобы он не искал дальше скобки:

egrep -o -m1 "(https)[^'\")]+?.mp3" mp3.txt
7
27.01.2020, 20:35

egrep не поддерживает нежадное сопоставление. Использование режима Perl -P поможет вам:

grep -o -m1 -P  'https.*?mp3' example.txt
4
27.01.2020, 20:35
~$ cat example.txt
(https://example.com/pathto/music.mp3)music.mp3

~$ grep -Po "(https)[^'\"].*?mp3" example.txt
https://example.com/pathto/music.mp3
1
27.01.2020, 20:35

Теги

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