Sed içinde bir desen bulmak için uygun regex nasıl kullanılır?


1

Aşağıdaki gibi bir dizi bilgi içeren bir dosyam var:

cat filename
    1   S121
    2   M121
    3   MS121
    4   SM154
    5   SM91 

Sadece aynı kalmaya devam edenlerin hepsini değiştirmeye çalışıyorum [mM] to MS. Aşağıdaki sed scriptdenendi

sed -r 's/ms?([0-9])/MS\1/Ig' filename

ancak yalnızca [mM] 'e özgü değildir ve 4 ve 5 satırlarını çıktıdaki gibi aşağıdaki gibi değiştirebilir:

4       SMS154
5       SMS91

Herhangi bir yardım takdir edilmektedir. tnx!

Yanıtlar:


1

Bu başlayarak bir alt eşleştirme "m" , isteğe bağlı olarak bunu takiben "s" , ve daha sonra bir rakam [0-9] .

4,5 satırlarındaki metin de bu alt dizgiyi içeriyor:

4 S M1 54

5 S M9 1

bu yüzden değiştirilirler.

Yalnızca # 2 sütununun ön ekiyle ilgilendiğinizi belirtmek için örüntüsünüzü "\ s" ile ön eklemeyi deneyin , şöyle:

sed -r 's/(\s)ms?([0-9])/\1XX\2/Ig'

Lütfen bana "\ s" ile ön ekleme hakkında daha fazla bilgi verebilir misiniz? ! \ s boşluk olduğunu [[: boşluk:]] okuyunuz. Regex'te "\ s" ön eki var. bu konuda nasıl / nereden daha fazla bilgi edinebilirim?
Daniel,

1
Tabii, bu oldukça kolay aslında, "\ s" bir boşluk için duruyor, bu nedenle "\ sms?" Yazarsanız, bu sadece # 2 sütunundaki dize başlangıcıyla eşleşecek, ancak sütun metninin içindeki alt dizge ile eşleşmeyecektir. .
zeplin

@zppelin Peki ya "ms" den önce bir sayı olursa 123s62890 diyelim. Bu komut dosyası daha sonra orada işe yaramaz. Herhangi bir alternatifiniz var mı lütfen :)
Daniel

1
Rakam veya boşlukla eşleştirmek için bir karakter aralığı kullanabilirsiniz; örneğin, yalnızca boşluk yerine, [0-9 \ s], sonra.
zeplin

0

Buna ne dersin ? Sorunuz için doğru mu?

sed -r 's/m([^s])/MS\1/Ig' file
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.