Processando variável local com expressões regulares

1

Eu tenho alguns arquivos de vídeo em source/ para codificar e quero que a saída seja salva no diretório local, portanto, removendo source/ no nome do arquivo.

Eu consegui isso usando o seguinte comando em fish shell:

$ for file in source/*.mkv
      ffmpeg -i "$file" -c:v copy -c:a copy (echo "$file" | sed -e "s/source\///")
  end

Embora, eu ache a saída de echo para sed um pouco rudimentar, existe uma função que apenas processa as strings de variáveis locais? Como um sed , mas apenas para variáveis locais ou nomes de arquivos.

    
por Pradana Aumars 27.02.2018 / 23:32

2 respostas

2

Você está removendo um nome de diretório (fixo) da string aqui.

No shell padrão, você pode fazer isso com a expansão ${parameter#pattern} , e remove pattern desde o início da string em parameter , então ${file#source/} removeria o prefixo source/ .

Além disso, em ksh / Bash / zsh ${parameter/pattern} , a correspondência é removida em qualquer lugar da string, o que corresponde a s/pattern// do sed mais de perto. ( ${..//..} para remover todas as correspondências). Esses padrões são os mesmos usados para curingas de nome de arquivo ; eles não são regexes.

Em fish , há o comando builtin string replace , que parece que pode ser usado aqui:

> set f source/foobar
> string replace source/ "" -- $f
foobar

ou com -r para regex, por isso não precisamos saber o caminho:

> string replace -r "^.*/" "" -- $f
foobar

(Note que eu não sou tão familiarizado com peixes. O acima pareceu funcionar, mas eu não tenho certeza se ele quebra em alguns casos de canto.)

    
por 27.02.2018 / 23:53
1

Você está procurando por basename :

ffmpeg -i $file -c:v copy -c:a copy (basename $file)
    
por 28.02.2018 / 01:17