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

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

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

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/\.$//'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.