Subseqüência de Bash da última ocorrência de um caractere

2

Eu estou tentando escrever um script que remove tudo após a última ocorrência de um caractere. Por exemplo, se a string for DATETIME 2014.03.14 12:23:24 , eu gostaria de obter apenas DATETIME 2014.03. . Então, tudo após a última ocorrência de um ponto deve ser removido. Eu tenho tentado diferentes variantes com sed e expr index , mas sem sucesso. A última vez que tentei obter o índice do último ponto e, em seguida, substring-lo, mas sem qualquer resultado:

expr index "DATETIME 2014.03.14 12:23:24" '.[0-9][/&][0-9]'

Isso retorna a posição do primeiro ponto em vez do último.

    
por RegedUser00x 14.03.2014 / 13:26

2 respostas

5

Use a expansão de parâmetros. % exclui a parte final de uma string

 d='DATETIME 2014.03.14 12:23:24'
 echo ${d%.*}.

Saída:

DATETIME 2014.03.
    
por 14.03.2014 / 13:31
1

Apenas para completar, eu demonstro uma maneira de resolvê-lo com sed :

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/[^.]*$//'
DATETIME 2014.03.
  • [^.]*$ corresponde a qualquer coisa mas um ponto literal, 0 ou mais vezes, seguido do final da linha.

Observe que isso removerá todos os caracteres das strings que não contêm o delimitador. Se isso não for desejado, uma versão que "ancora" a substituição ao delimitador pode ser:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\.[^.]*$/./'
DATETIME 2014.03.
  • \. corresponde a um ponto literal.
  • A última ocorrência de . reinsere o caractere delimitador que seria removido. Uma variante sem essa repetição extra poderia ser:

    $ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\(\.\)[^.]*$//'
    DATETIME 2014.03.
    

    onde o delimitador é capturado para não precisar reinseri-lo explicitamente no padrão de substituição.

por 14.03.2014 / 13:49

Tags