Bir karakterin son oluşumunu sed kullanarak dizgede nasıl değiştiririm?


31

Bir dizgede sadece "-" nin son oluşumunu boşluk kullanarak sednasıl değiştiririm?

Örneğin:

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

fakat aşağıdaki çıktıyı almak istiyorum (son kısa çizgiyi [“-“] bir boşlukla değiştirmek)

swp-RedHat-Linux-OS-5.5.0.0 03

Yanıtlar:


48

Tek ile yapabilirsiniz sed:

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

veya genişletilmiş düzenli ifade kullanarak:

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

Mesele şu ki sedaçgözlü, bu yüzden -diğerleri de dahil olmak üzere mümkün olduğunca önce birçok karakterle eşleşiyor -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03

2
Not, bu taşınabilir değildir. GNU dışı bazı sürümleri, seddesen eşleşmelerini desteklemez. Bu durumda, perl -pne 's/(.*)-/$1 /'ya da @ Thor'un parametre genişletme çözümü ya da başka bir şeye ihtiyacınız olacak.
Adam Katz

elbette :-) thx ...
Greg

Tek tırnak kullanırken bu parantezlerden kaçmanıza gerek yoktur.
jgmjgm

@jgmjgm Uzatılmış normal ifadeyi kullanarak ters eğik çizgileri ihmal edebilirsiniz sed -r.
jimmij

1
@VinayPotluri Deneyin sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij


11

Bunun gibi bir şey benim için işe yaradı, ancak daha iyi yollar olduğuna eminim.

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03

Bu kötü ... düz kötü. Neden 2 işlem yapabiliyorken 4 işlem yapıyorsunuz?
Joshpbarron

7
Düzenli ifadelerin yalnızca temel bir anlayışa sahip biri için, bu cevaplar çok daha ulaşılabilir görünüyor. Ne kadar operasyon gerçekleştirdiği kimin umrunda, bu tüm pratik durumlar için anında olacak. Bu yüzden mümkün olduğunca az işlem kullanmak için bazı keyfi kurallar üzerindeki okunabilirliği göz önünde bulundururum.
Psirus

5
@Psirus Bu solucanlar bir kutu açmak gitmiyor umuyoruz, ama daha az işlemleri kullanma fikri belirli bir düzeyde vitrin olduğunu ustalık arasında daha az operasyonları. Örneğin, @ Thor'un cevabı bashOP de kullanıyorsa iyi çalışan parametre genişletme özelliğinin bir değerini gösterir bash. Okunabilirlik (çok ayrıntılı olma noktasına kadar) ile doğru araçları kullanma arasında hassas bir denge olacak, ancak doğru araçları kullanmamaktan daha sık hüküm sürecektir.
hjk
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.