Bir sözcükteki son karakteri sil, ancak karakter oradaysa - bash içinde


13

Son karakter sadece oradaysa nasıl kaldırılır?

giriş:

OpenOffice.org/m
openOffice.org/ozm
Pers.
Pfg.
Phil.
Prof.
Resp.
Roonstr./m
roonstr./ozm

Istenilen çıktı:

OpenOffice.org
openOffice.org
pers
pfg
phil
profesör
solunum
Roonstr
Roonstr

Şimdiye kadar sadece nokta kaldı ama maalesef son sed komutu da mektubu kaldırır g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

Yanıtlar:


13

Sadece sedkomutunuzdaki noktadan kaçmanız gerekiyor ve her şey iyi olacak. Bunun gibi:

sed 's/\.$//'

Çünkü kaçmazsanız .$, dizenin sonundaki herhangi bir karakterle eşleşir.

Ayrıca tüm sed+ grep+ cutöğelerinizi yalnızca bir tanesine koyabilirsiniz sed:

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

Harika, teşekkürler, çalışıyor! :) 300 binden fazla satır içeren bir sözlük kullanıyorum bu yüzden grep "\" kullanıyorum. sadece nokta olan kelimeleri almak için.
removelastdotonlyifitsthere

Böyle sorulmak ile bunu yapabilir da sed: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Her neyse grep+ bir sedtaneden çok daha uzun süre çalışacaktır sed.
acele

Bir sed ile yapılabilirse olsa güzel olurdu. Son sed komutunuzu nasıl uygulayabilirsiniz?
removelastdotonlyifitsthere

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

Şimdi teşekkürler kesime ihtiyacım yok, ama grep hala orada. Piped grep komutumun bir sed eşdeğeri daha sonra grep'i kaldıracaktı, mümkünse güzel olurdu. "Ayrıca tüm sed + grep + sadece bir sed kesilmiş koyabilirsiniz" benim için çalışmıyor, tüm kelimeleri yazdırır?
removelastdotonlyifitsthere

1

Bir karakteri yalnızca parametre genişletmelerinin tam açıklaması varsa kaldırma .

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

Bu durumda nokta özel değildir (normal ifadede nokta özeldir).

Diğer desen şunlarla kaldırılabilir %/*:

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

Her ikisini de kaldırmak için:

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

Tabii ki, bir kaynak dosya ile çalışmak dosya üzerinde sed kullanmak daha hızlıdır.
Sadece noktayı alıntılamayı unutmayın (kelimenin tam anlamıyla eşleştirmek, aksi takdirde herhangi bir karakter anlamına gelir).

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

Bu kabul edilen cevap olmalı. Daha fazla oy gerekiyor.
David Parks

0

Normal ifadenizi hafifçe değiştirin: kaçmak için . Ve ihtiyacınız yokgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.