Como posso me referir a uma string pelo índice em sh / bash? Ou seja, basicamente dividindo.
Estou tentando retirar 5 caracteres de um nome de arquivo. Todos os nomes têm a estrutura: name_nr_code. Estou tentando remover o bit de código 5 alfanumérico. name_nr_
tem sempre 10 caracteres.
Existe algo como;
for i in * ; do mv "$i" "$i"[:10] ; done
bash
tag se você está pedindo umash
solução?Respostas:
Simples assim.
(bater)
Voila.
E uma explicação do Advanced Bash-Scripting Guide ( Capítulo 10. Manipulando Variáveis ) , (com NOTEs adicionais embutidos para destacar os erros nesse manual):
NOTEcotações ausentes em torno de expansões de parâmetros!
echo
não deve ser usado para dados arbitrários.NOTE:
expr substr
é uma extensão GNU.NOTE: Isso
echo
é redundante e o torna ainda menos confiável. Useexpr substr + "$string1" 1 2
.NOTE:
expr
retornará com um status de saída diferente de zero se a saída for 0 (ou -0, 00 ...).Entre. O livro está presente no repositório oficial do Ubuntu como
abs-guide
.fonte
${var:1}
não retorna o valor davar
"1ª posição", mas sim da 2ª posição.No POSIX
sh
,"${var%?????}"
é$var
retirado dos últimos 5 caracteres à direita (ou$var
se$var
contiver menos de 5 caracteres)"${var%"${var#??????????}"}"
são os 10 primeiros caracteres de$var
."${var%_*}"
é$var
retirado da string mais curta que corresponde_*
ao final de$var
(foo_bar_baz
->foo_bar
)."${var%%_*}"
: correspondência igual, porém mais longa, em vez da correspondência mais curta (foo_bar_baz
->foo
).foo_bar_
:"${var%"${var##*_}"}"
(${var##pattern}
é o mesmo que${var%%pattern}
procurar o padrão no início e$var
não no final).Com
zsh
:$var[1,-6]
do primeiro caractere para o sexto a partir do final (todos, exceto os últimos 5).$var[1,10]
para os 10 primeiros caracteres.Com
ksh
,bash
ouzsh
:"${var:0:10}"
: primeiros 10 caracteres de$var
Com
bash
ouzsh
:"${var:0:-5}"
: todos, exceto os últimos 5 caracteres (emite um erro e sai do script se$var
estiver definido, mas contém menos de 5 caracteres, também quando$var
não estiver definidozsh
).Se você precisa de
sh
compatibilidade com Bourne , é muito difícil fazer isso com segurança. Se você pode garantir que o resultado não termine com caracteres de nova linha, é possível:Você também terá um limite no comprimento de
$var
(variando entre sistemas).Em todas essas soluções, se houver
$var
bytes que não possam formar parte de caracteres válidos, YMMV.fonte
sh
não fornece uma maneira integrada de obter uma subcadeia de caracteres de uma string (tanto quanto eu posso ver), masbash
você pode fazer issoIsso fornecerá os dez primeiros caracteres do valor da variável
i
.O formato geral é
${variable:offset:length}
.fonte
A maioria dos shells suporta algum tipo de expansão de parâmetro que pode ajudá-lo. No bash, você pode usar
Em
dash
, compensações não são suportadas, mas você pode usar padrões à esquerda e à direita:fonte
Primeiro, não use um
for
loop para nomes de arquivos.Então, algo assim deve ajudar.
fonte
for
com nomes de arquivos?printf
para ser mais seguro. ... eread -r
.for
loop do OP estava bom, exceto talvez pelos desaparecidos--
. Eu posso ver pelo menos 10 bugs em suas 4 linhas de código! muitos dos quais bem conhecida má prática como assumindo os nomes de arquivos são uma única linha, o uso de eco, citações desaparecidas