regex localizar substituir strings começando ou começando com barra invertida

0

Eu tenho um álbum de compilação na minha biblioteca de músicas que tem títulos de músicas na forma de ARTIST/ TITLE , o que dificulta muito a cp ou mv desses arquivos por causa da barra. Então eu gostaria de renomear os arquivos para Title (Artist) para torná-los mais gerenciáveis (e também para que eles sejam nomeados de uma forma consistente com o resto da minha biblioteca de músicas). Aqui está o que eu tenho até agora:

#! /bin/bash

for i in ./*.flac; do
TITLE='ls "$i" | sed #display string after backslash'
ARTIST='ls "$i" | sed #display string before backslash'

mv ./"$i" ./"$TITLE ($ARTIST)"

done

Lembre-se também de que há um espaço após a barra em ARTIST/ TITLE , o que pode atrapalhar as coisas também.

    
por curios 02.02.2015 / 03:08

1 resposta

2

Acho que sua pergunta é:

Eu tenho uma variável bash que contém uma string; Eu gostaria de dividi-lo em duas partes, antes e depois da string "/ " .

Se sim, aqui está uma solução básica:

track="Judy Garland/ Somewhere Over the Rainbow"
title="${track#*/ }"
artist="${track%%/ *}"

A sintaxe # significa "Sem o prefixo mais curto que corresponde a ...". A sintaxe %% significa "Sem o maior sufixo correspondente ...". (Da mesma forma, ## teria sido o prefixo mais longo e % sufixo mais curto.) O padrão é um bash ordinário (ou um bash bash estendido se shopt -s extglob estiver em vigor). Não é uma expressão regular.

Se o padrão não corresponder, a string será retornada sem modificações e você provavelmente deverá verificar essa condição, especialmente se não tiver certeza de que haverá um espaço após a barra.

A propósito, por que você está usando ls "$i" ? Certamente isso não é diferente do valor de $i ; você poderia muito bem ter usado echo ou uma "string aqui":

sed '# some sed magic' <<<"$i"
    
por 02.02.2015 / 05:24