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

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

Ś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

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/\.$//'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.