sed'nin regex'sinde “|” değişiminin kullanımı


78

Sed, GNU sed sürüm 4.2.1 kullanıyorum. "|" Değişimini kullanmak istiyorum bir alt ifadede sembol. Örneğin :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

geri dönmeli

" blib bou "

ama geri döner

"blia blib bou blf".

Beklenen sonucu nasıl alabilirim?

Yanıtlar:


110

"|" ayrıca özel anlamını elde etmek için ters eğik çizgiye ihtiyacı var.

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

ne istersen onu yapacağım.

Bildiğiniz gibi, diğerleri başarısız olursa, el kitabını :-) okuyun.

GNU sed kullanım kılavuzu , bölüm 3.3 Normal İfade Sözdizimine Genel Bakış :

`REGEXP1 \ | REGEXP2'

REGEXP1 veya REGEXP2 ile eşleşir.

Ters eğik çizgi dikkat edin ...

Maalesef, regex sözdizimi gerçekten standartlaştırılmamıştır ... "özel karakterlerin" ihtiyacı olan ve olmayan diğer şeylerden farklı olan birçok değişken vardır. Hatta bazılarında yapılandırılabilir veya anahtarlara bağlı ( grepüç farklı regex lehçesi arasında geçiş yapabileceğiniz GNU'da olduğu gibi).

Özellikle bu cevap GNU sed içindir . sedÖrneğin BSD'lerde kullanılan ve farklı davranış gösteren başka değişkenler de vardır .


35
Bu cevaba karışan başkası için \ | sadece gnu sed ile çalışır (os x üzerine yapıştırılmış) vanilya sed değil (os x üzerinde sed).
Andrew Hancox

@AndrewHancox Çok teşekkür ederim! Kafamdaki tüm saçları koparmak üzereydim (ve şimdiye dek saçtaki yöneticime kıyasla oldukça iyiyim) - RegEx'i yeterince deneyeceğimi biliyorum | ve \ | Fakat OSX'in gerçekte gnu sed kullanabileceğini düşünmedim.
phatskat

8
Standart BSD / OS X versiyonu, sedalternatifi destekliyor, ancak yalnızca "genişletilmiş" regex sözdizimiyle ( -E) - bu, borularda veya parantezlerde ters eğik çizgi olmaması anlamına geliyor:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Mark Reed

2
Cevabımı, yalnızca GNU sed için olduğunu not etmek için düzenledim.
sleske

22

Gnu dışı seduygulamalarla ilgili birkaç yorum olduğundan : En azından OS X’de şu -Eargümanı kullanabilirsiniz  sed:

Düzenli ifadeleri, temel normal ifadeler (BRE'ler) yerine genişletilmiş (modern) normal ifadeler olarak yorumlayın. Re_format (7) kılavuz sayfası her iki formatı da tamamen açıklar.

Ardından, normal ifade meta karakterlerini onlardan kaçmadan kullanabilirsiniz. Örnek:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 

12

GNU sed ayrıca -rseçeneği de destekler (genişletilmiş düzenli ifadeler). Bu, meta karakterlerden kaçmanıza gerek olmadığı anlamına gelir:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

Çıktı:

hi hi

Evet, -rseçenek ifadelerin okunabilirliği için gerçekten çok yararlıdır. Kabul edilen cevap bu olmalı.
рüффп

9

\|Ya Solaris 10 üzerinde sed ile çalışmaz. Yaptığım şey kullanmaktı

perl -p -e 's/bl(ia|f)//g'

2
Taşınabilirlik için +1, çünkü bir sistem perl ise, sed'nin aksine her zaman bu sözdizimini kullanır.
Evilsoup

4

Takip: sed -E MacOS'ta izin verir. | İçin ters eğik çizgi gerekmez.

 sed -E 's/this|orthat/oooo/g' infile

1

Windows üzerinde GnuWin32 içinde sed sözdizimi var sed "s/thing1\|thing2/ /g" source > destination.

Tırnaklar türünde "yazılmalıdır - bu, ayrıştırılacak komut için "Gerekli" dir.

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.