Hapus karakter terakhir dalam sebuah kata tetapi hanya jika karakternya ada - dalam bash

12

Bagaimana cara menghapus karakter terakhir hanya jika ada?

memasukkan:

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

output yang diinginkan:

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

Saya mengerti sejauh ini bahwa hanya titik yang tersisa, tetapi sayangnya perintah sed terakhir juga menghapus huruf g: $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

removelastdotonlyifitsthere
sumber

Jawaban:

12

Anda hanya perlu menghindari titik dalam sedperintah Anda dan semuanya akan baik-baik saja. Seperti ini:

sed 's/\.$//'

Karena jika Anda tidak menghindarinya, .$akan cocok dengan karakter apa pun di akhir string.

Anda juga dapat menempatkan semua Anda sed+ grep+ cutmenjadi hanya satu sed:

sed 's=/[^/]*$==;s/\.$//' filename
buru-buru
sumber
Hebat, terima kasih, bekerja! :) Saya menggunakan kamus dengan lebih dari 300k baris jadi ini sebabnya saya menggunakan grep "\." hanya untuk mendapatkan kata-kata dengan titik di sana.
removelastdotonlyifitsthere
sed juga dapat melakukannya dengan bertiga seperti ini: sed -n '/\./{s=/[^/]*$==;s/\.$//;p}. Lagi pula grep+ sedakan bekerja lebih lama dari satu sed.
buru
Jika itu bisa dilakukan dengan satu sed itu akan lebih baik. Bagaimana cara menerapkan perintah sed terakhir Anda?
removelastdotonlyifitsthere
sed 's/[./]\+[^./]*$//'
Peter.O
Terima kasih sekarang saya tidak perlu memotong, tetapi grep masih ada. Setara sed perintah grep piped saya kemudian akan menghapus grep untuk, jika memungkinkan, itu akan menyenangkan. "Juga kamu bisa memasukkan semua sed + grep + potong menjadi hanya satu sed" tidak bekerja untukku, mencetak semua kata?
removelastdotonlyifitsthere
1

Menghapus karakter hanya jika ada persis deskripsi ekspansi parameter.

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

Titik tidak spesial dalam kasus ini (titik khusus dalam regex).

Pola lainnya dapat dihapus dengan %/*:

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

Untuk menghapus keduanya:

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

Tentu saja, untuk bekerja dengan file sumber lebih cepat menggunakan sed pada file.
Hanya ingat untuk mengutip titik (untuk mencocokkan secara harfiah, jika tidak berarti: karakter apa saja).

 $ sed 's,/.*,,;s,\.$,,' file
NotAnUnixNazi
sumber
Ini harus menjadi jawaban yang diterima. Perlu lebih banyak upvotes.
David Parks
0

Hanya sedikit mengubah ekspresi reguler Anda: untuk keluar dari . Dan Anda tidak perlugrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
medifle
sumber