Usuń ostatni znak w słowie, ale tylko jeśli znak tam jest - w skrócie

13

Jak usunąć ostatnią postać tylko wtedy, gdy ona tam jest?

Wejście:

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

Pożądane wyjście:

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

Dotarłem do tej pory, że pozostała tylko kropka, ale niestety ostatnie polecenie sed usuwa również literę g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

removeelastdotonlyifitsthere
źródło

Odpowiedzi:

13

Musisz tylko uciec przed kropką w swoim sedpoleceniu i wszystko będzie dobrze. Lubię to:

sed 's/\.$//'

Ponieważ w przypadku, gdy go nie unikniesz, .$dopasuje się do dowolnego znaku na końcu łańcucha.

Możesz także umieścić wszystkie sed+ grep+ cutw jednym sed:

sed 's=/[^/]*$==;s/\.$//' filename
wysypka
źródło
Świetnie, dziękuję, działa! :) Korzystam ze słownika zawierającego ponad 300 000 wierszy, dlatego używam grep „\”. aby uzyskać tylko słowa z kropką.
removeelastdotonlyifitsthere
sed również może to zrobić z czymś tak: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. W każdym razie grep+ sedbędzie działać znacznie dłużej niż tylko jeden sed.
pędzi
Gdyby można to zrobić za pomocą jednego seda, byłoby miło. Jak zastosować swoje ostatnie polecenie sed?
removeelastdotonlyifitsthere
sed 's/[./]\+[^./]*$//'
Peter.O,
Dzięki teraz nie potrzebuję cięcia, ale grep wciąż tam jest. Odpowiednik sed mojego polecenia pipowania grep usunąłby grep, aby, jeśli to możliwe, byłoby miło. „Możesz też umieścić wszystkie swoje sed + grep + pokroić w jeden sed” nie działa dla mnie, drukuje wszystkie słowa?
removeelastdotonlyifitsthere
1

Usuwanie znaku tylko wtedy, gdy jest, istnieje dokładnie opis rozszerzeń parametrów.

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

Kropka nie jest w tym przypadku wyjątkowa (kropka jest wyjątkowa w wyrażeniu regularnym).

Drugi wzór można usunąć za pomocą %/*:

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

Aby usunąć oba:

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

Oczywiście do pracy z plikiem źródłowym szybsze jest użycie sed na pliku.
Pamiętaj tylko o cytowaniu kropki (aby dopasować ją dosłownie, w przeciwnym razie oznacza to: dowolny znak).

 $ sed 's,/.*,,;s,\.$,,' file
Izaak
źródło
To powinna być zaakceptowana odpowiedź. Potrzebuje więcej głosów pozytywnych.
David Parks
0

Wystarczy nieznacznie zmienić wyrażenie regularne: aby uciec od . I nie potrzebujeszgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
medifle
źródło