Exclua o último caractere de uma palavra, mas somente se o caractere estiver presente - no bash

12

Como remover o último caractere apenas se estiver lá?

entrada:

OpenOffice.org/m
openOffice.org/ozm
Pers.
Pfg.
phil.
Prof.
resp.
Roonstr./m
roonstr./ozm

saída desejada:

OpenOffice.org
openOffice.org
Pers
Pfg
phil
Prof
resp
Roonstr
roonstr

Entendi até agora que resta apenas o ponto, mas infelizmente o último comando sed também remove a letra g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

removeelastdotonlyifitsthere
fonte

Respostas:

12

Você só precisa escapar do ponto em seu sedcomando e tudo ficará bem. Como isso:

sed 's/\.$//'

Porque, no caso de você não escapar, .$corresponderá a qualquer caractere no final da string.

Além disso, você pode colocar todo o seu sed+ grep+ cutem apenas um sed:

sed 's=/[^/]*$==;s/\.$//' filename
pressa
fonte
Ótimo, obrigado, funciona! :) Eu uso um dicionário com mais de 300k linhas, por isso uso grep "\." para obter apenas as palavras com um ponto lá.
removelastdotonlyifitsthere 15/08/12
sed também pode fazê-lo com smth como este: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Enfim grep+ sedfuncionará muito mais do que apenas um sed.
apressar
Se isso puder ser feito com um sed, seria bom. Como aplicar seu último comando sed?
removelastdotonlyifitsthere 15/08/12
sed 's/[./]\+[^./]*$//'
precisa saber é o seguinte
Obrigado agora eu não preciso cortar, mas o grep ainda está lá. Um equivalente sed do meu comando grep canalizado removeria o grep para, se possível, seria bom. "Além disso, você pode colocar todo o seu sed + grep + cortado em apenas um sed" não funciona para mim, imprime todas as palavras?
removelastdotonlyifitsthere 15/08/12
1

Removendo um caractere somente se houver, existe exatamente a descrição das expansões de parâmetro.

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

O ponto não é especial neste caso (um ponto é especial em uma regex).

O outro padrão pode ser removido com %/*:

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

Para remover os dois:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

Obviamente, para trabalhar com um arquivo de origem, é mais rápido usar o sed no arquivo.
Lembre-se de citar o ponto (para combiná-lo literalmente, caso contrário, significa: qualquer caractere).

 $ sed 's,/.*,,;s,\.$,,' file
NotAnUnixNazi
fonte
Essa deve ser a resposta aceita. Precisa de mais votos.
David Parks
0

Apenas altere levemente sua expressão regular: para escapar do . E você não precisagrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
medifle
fonte