İki nokta üst üste tüm karakterleri değiştirmek için Sed nasıl kullanılır?


25

Aşağıdaki dizeyi nasıl değiştiririm

hd_ma_prod_customer_ro:*:123456789:john.doe

john.doe ile

Temelde son kolonu aramam gerekiyor (:) ve daha önce ve sonra her şeyi silmeliyim.

Yanıtlar:


40

Aslında ne demek istediğinizi varsayalım ki son sütuna kadar olan her şeyi silmek ve john.doebozulmadan bırakmak istiyorsunuz :

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Açıklama:

İlk satır sadece test dizisini sedörneğin amaçlara yönlendirir.

İkincisi, temel bir sedikamedir . Birinci ve ikinci arasındaki kısım /aranacak regex'tir ve ikinci ve üçüncü arasındaki kısım değiştirilecek olanla değiştirilir (bu durumda silerken hiçbir şey yoktur).

Düzenli ifade için, .herhangi bir karakterle eşleşir, *bunu herhangi bir sayıda (sıfır dahil) tekrarlar ve :iki nokta üst üste eşleştirir. Öyleyse etkili bir şekilde onu izleyen kolon. Yana .*iki nokta üst üste içerebilir, maç 'açgözlü' ve her şeyi son kolona dahildir.


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Tüm oluşumlarını değiştiriyorum : bir sekmeyle ve sonra awkjohn.doe dizesini çıkarmak için kullanıyorum .

Eğer bir dosyanız yoksa bunu deneyebilirsiniz.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Graeme yorumlarına gereğince kullanabileceğimiz awkkullanarak sadece geçen sütunu yazdırmak için NFbir değişkeni awkaşağıdaki gibi.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Gereksizlerden kurtulmak için Graeme'nin yorumlarını dahil etmek sed

Komut aşağıdaki gibi değiştirilebilir.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
Kullanacaksanız awk, neden sadece kullanmıyorsunuz awk -F:?
Graeme

@Graeme, hala o kadar rahat değilim awk. Temel olarak, cevabımda aldığım komutları test etmeye ve kullanıcının ihtiyacına göre değiştirmeye çalışıyorum. :)
Ramesh

3
Alan -Fseçeneği awkayırıcıyı belirtir. Eğer awkiki nokta üst üste kullanmanız gerekiyorsa, iki nokta üst üste sekmeyle gerek yoktur. Ayrıca, $NFyerine kullanabileceğiniz son alanı elde etmek istiyorsanız, $4her zaman 3 sütun yoksa, bu işe yarar.
Graeme

@Graeme, bahsettiğiniz değişiklikleri dahil ettik. Lütfen bu iyi ise bana bildirin :)
Ramesh

Evet, mükemmel çalışıyor!
Graeme


2

Deneyin lütfen

düzenleme: çapa kaldırıldı

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

ve silmek

echo 'abc:fjk' |sed 's/.*://g'

OP'nin istediği şey bu değil
iruvar

lütfen soruyu tekrar okuyun.
akash

Benim
yorumumdan

Ah anlıyorum . özür dilerim 1_CR
akash 12:14

1
^Çapa ya Sorunun durumunda veya örnek durumda hiç fark etmez. İle başlayan herhangi bir adres /.*zaten anlamına gelir ^.
mikeserv
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.