excluindo caracteres em uma string usando sed

1

Estou tentando escrever um sed que excluirá 11 caracteres numéricos do final de uma string. aqui está o meu código ...

fname="1a.out12345678901"

fname=$(echo "$fname"|sed 's/[0-9]{11}//')

no entanto, isso só definirá fname como 1a.out12345678901 Como usaria sed para excluir 12345678901 do final da string?

    
por mike 08.12.2017 / 01:48

3 respostas

1

O Bash pode fazer o que sem invocar processos externos.

Se fname terminar com 11 números, isso os removerá:

[[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}

Notas:

  1. Como essa abordagem não requer a criação de subshells ou processos externos, ela será mais rápida. Se essa tarefa for realizada em um loop, a velocidade poderá ser importante.

  2. A substituição de comandos, $(...) , tem efeitos colaterais que talvez você não queira. O shell, por exemplo, retira novas linhas da substituição do comando.

  3. Essa abordagem não é POSIX. Requer bash.

Exemplos

Isso ilustra a remoção dos últimos 11 dígitos:

$ fname="1a.out12345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out

Se fname terminar com mais de 11 dígitos, somente os últimos 11 serão removidos:

$ fname="1a.out012345678901"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out0

Se fname terminar com menos de 11 dígitos, nenhum será removido:

$ fname="1a.out1234567890"; [[ $fname =~ (.*)[0-9]{11}$ ]] && fname=${BASH_REMATCH[1]}; echo "fname=$fname"
fname=1a.out1234567890
    
por 08.12.2017 / 02:19
1

Algumas coisas:

  1. Você não ancora no final da string usando $ , então isso pode acabar excluindo os caracteres em outro lugar
  2. { é apenas sintaticamente significativo quando no modo ERE usando sed -r quando suportado, caso contrário você precisa de \{ e \}
  3. [0-9] tem um significado dependente de localidade, para garantir o comportamento desejado, você deve definir uma localidade que corresponda às suas expectativas (nesse caso, C )

Colocando isso em conjunto:

$ echo 1a.out12345678901 | LC_ALL=C sed 's/[0-9]\{11\}$//'
1a.out
    
por 08.12.2017 / 02:05
0

Existem várias maneiras simples de fazer isso. Você pode usar cabeça, cauda ou corte, sem sed ou regex é necessário:

Ao usar o cabeçalho:

fname="1a.out12345678901"
fname=$(echo "$fname"|head -c -12)

head -c -N, corta os últimos caracteres N-1. cauda pode fazer o trabalho também.

Usando o corte:

fname="1a.out12345678901"
fname=$(echo "$fname"|rev |cut -c 12-|rev)

rev irá inverter a string

cut -c 12- significa cortar os 11 primeiros caracteres e começar com o 12º caractere.

    
por 08.12.2017 / 02:12