Supprimer le dernier caractère d'un mot mais seulement si le caractère est là - en bash


13

Comment supprimer le dernier caractère uniquement s'il est là?

contribution:

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

Sortie désirée:

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

Je l'ai si loin que seul le point est laissé, mais malheureusement, la dernière commande sed supprime également la lettre g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

Réponses:


13

Vous avez juste besoin d'échapper au point de votre sedcommande et tout ira bien. Comme ça:

sed 's/\.$//'

Parce que dans le cas où vous n'y échappez pas, .$correspondra à n'importe quel caractère à la fin de la chaîne.

Vous pouvez également mettre tous vos sed+ grep+ cuten un seul sed:

sed 's=/[^/]*$==;s/\.$//' filename

Super, merci, ça marche! :) J'utilise un dictionnaire avec plus de 300k lignes, c'est pourquoi j'utilise grep "\." pour obtenir uniquement les mots avec un point.
removelastdotonlyifitsthere

sed peut aussi le faire avec smth comme ceci: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Quoi qu'il en soit grep+ sedfonctionnera beaucoup plus longtemps qu'un seul sed.
rush

Si cela peut être fait avec un sed, ce serait bien. Comment appliquer votre dernière commande sed?
removelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter.O

Merci maintenant, je n'ai pas besoin de couper, mais grep est toujours là. Un équivalent sed de ma commande piped grep supprimerait alors le grep pour, si c'est possible, ce serait bien. "Vous pouvez également mettre tous vos sed + grep + cut en un seul sed" ne fonctionne pas pour moi, imprime tous les mots?
removelastdotonlyifitsthere

1

Supprimer un caractère uniquement s'il y est correspond exactement à la description des extensions de paramètres.

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

Le point n'est pas spécial dans ce cas (un point est spécial dans une expression régulière).

L'autre modèle pourrait être supprimé avec %/*:

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

Pour supprimer les deux:

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

Bien sûr, pour travailler avec un fichier source, il est plus rapide d'utiliser sed sur le fichier.
N'oubliez pas de citer le point (pour le faire correspondre littéralement, sinon cela signifie: n'importe quel caractère).

 $ sed 's,/.*,,;s,\.$,,' file

Cela devrait être la réponse acceptée. A besoin de plus de votes positifs.
David Parks

0

Changez juste légèrement votre expression régulière: pour échapper au . Et vous n'avez pas besoingrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.