sed - * funciona, + não?

0

Estou renomeando um monte de arquivos de música, retirando os números das faixas usando sed. No entanto, estou confuso com o comportamento do sed em relação ao caractere '+' para expressões regex.

O que eu queria fazer:

for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9]+/\-/g'; done

Mas isso não funcionou como pretendido. Esta solução alternativa fez o trabalho:

for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9][0-9]*/\-/g'; done

No entanto, gostaria de saber qual é o problema com o uso de '+' em sed ... Alguma idéia?

    
por koen 27.06.2018 / 13:45

1 resposta

3

+ é um modificador de expressão regular estendido. sed expressões regulares básicas por padrão.

Para fazer sed analisar suas expressões como expressões regulares estendidas, use sed -E . O GNU sed também entende + em expressões regulares básicas se você usá-lo como \+ .

Além disso, seu padrão *\-[0-9]** parece estranho. O - não precisa de escape (não no padrão de shell e não na expressão regular) e, a menos que você use globstar in bash , o padrão ** expandirá para si mesmo. Com globstar habilitado em bash *-[0-9]** seria expandido para todos os nomes de caminho que contêm -N no primeiro componente de nome de arquivo (em que N é um dígito).

O que eu acho que você gostaria de fazer é algo assim (provavelmente não é bem assim, mas não sei como são seus nomes de arquivos):

for name in *-[0-9][0-9]*; do
    newname=${name%-*}
    printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
    # mv "$name" "$newname"
done

Isso corresponde a todos os nomes no diretório atual que contém -NN ( N é um dígito). Ele remove tudo do último - no nome do arquivo e renomeia o arquivo (a renomeação real é comentada).

    
por 27.06.2018 / 13:48

Tags