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/.$//'

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

Ó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

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/\.$//'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.