Sed: Her yeni satırdaki deseni değiştir?


10

sedDeseni her ikinci olayda değiştirmenin bir yolu var mı ? Ya da en azından her iki satırda mı? (Elbette bir senaryo ile mümkün, ama kendime sedbunu yapıp yapamayacağımı soruyordum ).

Düzenle

buldum

sed -e "s/pattern/replacement/g;n"

Ama ikincisinin değil her ilk oluşumun yerini aldı.

Misal

Giriş dosyası:

I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

Istenilen çıktı:

I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement

Yanıtlar:


6

bkz. /programming/5858200/sed-replace-every-nth-occurrence

Çözüm sed yerine awk kullanır, ancak "iş için doğru aracı kullanın". Sed'de yapmak mümkün olabilir veya olmayabilir , ancak olsa bile, awk veya perl gibi bir araçta çok daha kolay olacaktır .


1
Orada öğrendiklerimi kullanarak sed -e 'n;s/2004-2009/6e législature/g'sorunumu çözen hizmetçi oldum .
Matthieu Riegler

1
her saniye gerçekleşmezse , her ikinci satırda deseninizi arayacaktır . yani 1., 3., 5., 7. vb. satırları atlayın. Tabii ki, bu sizin belgeniz için hala işe yarayabilir.
cas

Evet biliyorum. Aslında ihtiyacım olan buydu.
Matthieu Riegler

14
sed 's/pattern/replacement/2'

Desene sahip her satırdaki ikinci oluşumun yerini alacak.


GNU'nuz varsa sed:

sed '1~2N ; s/pattern/replacement/2'

Birinci satırdan başlayarak, ekteki 1satır desen alanına eklenecek, Nardından skomut kalıbın ikinci tekrarının yerini alacaktır. sonra sediki satır aşağı hareket eder ~2ve tekrar eder.


Ben ikincisini istemiyorum ama her saniyeyi.
Matthieu Riegler

Her satıra bir desenim var. Bu işe yaramaz.
Matthieu Riegler

bunu önceden bilmek güzel olurdu. Öyleyse, desen bir, iki, üç ve dört (vb.) Üzerinde olur ve iki, dört, vb.
llua

daha kısa bir alternatif olabilir code(sed '1 ~ 2s / pattern / replacement /')
jaap

2

Basit yorum:

En az bir PATTERN oluşumunu içeren ilk satırda yoksaymak ve satırı olduğu gibi yazdırmak istiyorsunuz. En az bir PATTERN oluşumunu içeren ikinci satırda, PATTERN'nin ilk örneğini DEĞİŞTİRME ile değiştirmek istersiniz. En az bir PATTERN oluşumunu içeren üçüncü satırda, satırı olduğu gibi yazdırmak istiyorsunuz. En az bir PATTERN oluşumunu içeren dördüncü satırda, PATTERN'nin ilk örneğini DEĞİŞTİRME ile değiştirmek istersiniz. Ve bunun gibi. PATTERN ile eşleşmeyen çizgiler değiştirilmeden yazdırılmalıdır.

Bu Sed ile kolayca yapılabilir:

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

Veya daha az boşluk ve daha kısa bir etiketle:

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

DÜZENLEME: Sadece soruyu tekrar okudum ve daha zor yorumu gördüm:

İlk oluşumla aynı satırda olsa da olmasa da, belgenin tamamındaki ikinci DİKİŞ ÇEŞİDİ DEĞİŞTİRME ile değiştirin. Birinci ve üçüncü olayları değiştirmeden bırakın. Vb.

Bunun Sed ile de yapılabileceğine inanıyorum, ancak çok daha zor ve kullanılacak düzenli ifadeye bağlı olduğuna inanıyorum. Bir şey üzerinde çalışıp yayınlamaya çalışacağım, ancak bu cevabın şimdilik basit versiyonda durmasına izin vereceğim.


tq{ sed '...'; cat; } <input
est'inizi

1

Çok yakındınız, sadece ilk satırı atlayın:

sed '1n;s/pattern/replacement/;n'

awkBu durumda neden daha iyi bir araç olmalı ?


0

Bir satırdaki bir sembol modeli: sed 's / (a ​​[^ a] *) a / \ 1c / g'

Her ikinci kalıp (satır başına yalnızca bir kalıp eşleşmesi görünebilir. Bir satır başına iki veya daha fazla eşleşme görünürse, yalnızca ikinci kalıp değiştirilir)

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'
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.