Yanıtlar:
"|" 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 .
sed
alternatifi 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'
Gnu dışı sed
uygulamalarla ilgili birkaç yorum olduğundan : En azından OS X’de şu -E
argü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
GNU sed ayrıca -r
seç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
-r
seçenek ifadelerin okunabilirliği için gerçekten çok yararlıdır. Kabul edilen cevap bu olmalı.
\|
Ya Solaris 10 üzerinde sed ile çalışmaz. Yaptığım şey kullanmaktı
perl -p -e 's/bl(ia|f)//g'
Takip: sed -E MacOS'ta izin verir. | İçin ters eğik çizgi gerekmez.
sed -E 's/this|orthat/oooo/g' infile