Eliminar el último carácter de una palabra, pero solo si el carácter está allí, en bash

12

¿Cómo eliminar el último personaje solo si está allí?

entrada:

OpenOffice.org/m
openOffice.org/ozm
Pers.
Pfg.
Phil.
Profe.
resp.
Roonstr./m
roonstr./ozm

salida deseada:

OpenOffice.org
openOffice.org
Pers
Pfg
phil
Profe
resp
Roonstr
Roonstr

Llegué tan lejos que solo queda el punto, pero desafortunadamente el último comando sed también elimina la letra g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

eliminar los últimos dotonly si hay
fuente

Respuestas:

12

Solo necesita escapar del punto en su sedcomando y todo estará bien. Me gusta esto:

sed 's/\.$//'

Porque en el caso de que no se te escape, .$coincidirá con cualquier carácter al final de la cadena.

También puedes poner todos tus sed+ grep+ cuten solo uno sed:

sed 's=/[^/]*$==;s/\.$//' filename
prisa
fuente
Genial, gracias, funciona! :) Utilizo un diccionario con más de 300 mil líneas, por eso utilizo grep "\". para obtener solo las palabras con un punto allí.
removelastdotonlyifitsthere
sed también puede hacerlo con algo bajo la siguiente manera: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. De todos modos grep+ sedfuncionará mucho más que solo uno sed.
prisa
Sin embargo, si se puede hacer con un sed, sería bueno. ¿Cómo aplicar tu último comando sed?
removelastdotonlyifitsthere
sed 's/[./]\+[^./]*$//'
Peter.O
Gracias ahora no necesito cortar, pero grep sigue ahí. Un equivalente sed de mi comando grep canalizado eliminaría el grep a, si es posible, sería bueno. "También puedes poner todo tu sed + grep + cortado en un solo sed" no funciona para mí, imprime todas las palabras?
removelastdotonlyifitsthere
1

Eliminar un carácter solo si está allí es exactamente la descripción de las expansiones de parámetros.

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

El punto no es especial en este caso (un punto es especial en una expresión regular).

El otro patrón podría eliminarse con %/*:

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

Para eliminar ambos:

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

Por supuesto, para trabajar con un archivo fuente es más rápido usar sed en el archivo.
Solo recuerde citar el punto (para que coincida literalmente, de lo contrario significa: cualquier carácter).

 $ sed 's,/.*,,;s,\.$,,' file
NotAnUnixNazi
fuente
Esta debería ser la respuesta aceptada. Necesita más votos a favor.
David Parks el
0

Solo cambia ligeramente tu expresión regular: para escapar del . Y no necesitasgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
metralla
fuente