Bagaimana cara mengganti kemunculan karakter terakhir dalam string menggunakan sed?

31

Bagaimana cara mengganti hanya kejadian "-" terakhir dalam string dengan spasi sed?

Sebagai contoh:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

tapi saya ingin mendapatkan output berikut (mengganti tanda hubung terakhir [“-“] dengan spasi)

swp-RedHat-Linux-OS-5.5.0.0 03
maihabunash
sumber

Jawaban:

48

Anda dapat melakukannya dengan satu sed:

sed 's/\(.*\)-/\1 /'

atau, menggunakan ekspresi reguler yang diperluas:

sed -r 's/(.*)-/\1 /'

Intinya sedsangat serakah, jadi cocokkan dengan sebanyak mungkin karakter sebelumnya -, termasuk yang lain -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03
jimmij
sumber
2
Catatan, ini bukan portabel. Beberapa versi non-GNU sedtidak mendukung kecocokan pola. Dalam hal ini, Anda akan membutuhkan sesuatu yang lain, baik itu perl -pne 's/(.*)-/$1 /'solusi solusi parameter atau @ Thor atau yang lain.
Adam Katz
tentu saja :-) thx ...
Greg
Anda tidak perlu melarikan diri dari kurung itu ketika menggunakan tanda kutip tunggal.
jgmjgm
@ jgmjgm Anda dapat menghilangkan garis miring terbalik dengan menggunakan persamaan reguler yang diperluas dengan sed -r.
jimmij
1
@VinayPotluri Coba sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij
27

Anda juga bisa menangani ini dengan ekspansi parameter bash :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Keluaran:

swp-RedHat-Linux-OS-5.5.0.0 03
Thor
sumber
Sangat kreatif, suka jawaban ini
dpritch
11

Sesuatu seperti ini bekerja untuk saya, walaupun saya yakin ada cara yang lebih baik

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
rahul
sumber
Ini buruk ... sangat buruk. Mengapa 4 operasi ketika Anda dapat melakukan 2?
Joshpbarron
7
Untuk seseorang yang hanya memiliki pemahaman dasar tentang ekspresi reguler, jawaban ini tampaknya jauh lebih mudah didekati. Dan siapa yang peduli berapa banyak operasi yang dibutuhkan, ini akan menjadi instan untuk semua kasus praktis. Jadi saya akan mempertimbangkan keterbacaan atas beberapa aturan arbitrer untuk menggunakan sesedikit mungkin operasi.
Psirus
5
@Psirus Saya harap ini tidak akan membuka sekaleng cacing, tapi ide menggunakan operasi yang lebih rendah adalah untuk menampilkan tingkat tertentu penguasaan dari yang lebih rendah operasi. Misalnya, jawaban @ Thor menunjukkan apresiasi bashfitur ekspansi parameter, yang berfungsi dengan baik jika OP juga menggunakan bash. Akan ada keseimbangan halus antara keterbacaan (sampai menjadi sangat verbose) dan menggunakan alat yang tepat, tetapi lebih sering daripada tidak menggunakan alat yang tepat menang.
hjk