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.
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.
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.