sed FreeBSD ve Linux üzerinde farklı davranıyor mu?


12

Hem Linux hem de FreeBSD kullanıyorum (özellikle Debian Linux ve PC-BSD kullanıyorum) ve garip bir şey buldum sed.

Sık sık "sekmeyle ayrılmış değerler" dosyaları "virgülle ayrılmış değerler" dönüştürmek gerekir. Bildiğim en basit yol şu şekilde kullanmaktır sed:

sed 's/\t/,/g' inputFile.txt > outputFile.csv

Bu Linux'ta mükemmel çalışır: Her sekmeyi virgülle değiştirir ... ancak FreeBSD'de hiçbir şeyin yerini almaz !!!

Bir şey mi kaçırıyorum? FreeBSD sedile Linux'takinden farklı bir sözdizimi var mı ?

Yanıtlar:


9

Belki de GNU Sed ile uyumluluğu korumak için -Eseçeneği (veya kılavuzda-r açıklandığı gibi ) kullanmalısınız. Sizin durumunuzda, Gnu Sed'i alışkınsanız ( FreeBSD'de port gsed ) kurabilirsiniz , ya da port komut dosyalarına uzun bir çaba harcar .

Ve Hatırla. BSD'deki bazı komutlar bu yardımcı programın gnu sürümü gibi davranmazsa, bu bozuk olduğu anlamına gelmez;)


1
Teşekkür ederim. -ESeçeneği (FreeBSD üzerinde ve Mac OS X her ikisi) hile yapar.
Barranka

FreeBSD 9'umda -E seçeneği yardımcı olmuyor.
Ark-kun

6

Evet, çeşitli farklılıklar var, kafamın üstünden bildiğim tek kişi-i olma davranışı .

Ben gerçekten ayrıntıları ile yardımcı olamaz bu yüzden BSD kullanmadım ama trbunun yerine bir geçici çözüm olabilir :

tr '\t' , < inputFile.txt > outputFile.csv

Hoş bir yan etki, trönemli ölçüde daha hızlı olması gerektiğidir. Linux'umda, her biri 2 sekme bulunan 50000 satırlık bir test dosyası kullanarak test ettim:

$ time tr '\t' , < foo.txt > /dev/null 

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time sed 's/\t/,/g' foo.txt > /dev/null 

real    0m0.039s
user    0m0.036s
sys     0m0.000s

tr '\t' ,daha taşınabilir tr $'\t' ,. tr '[\t]' '[,]'hatta bazı eski SysV sistemlerine taşınabilir.
Stéphane Chazelas

sekmesi, için varsayılan sınırlayıcıdır cut. İçin POSIX Spec trolduğunu orada . [Eski SysV için gerekli hakkında yanılmışım . POSIX spesifikasyonunun belirttiği gibi [sadece oradaki aralıklar için gereklidir.
Stéphane Chazelas

@StephaneChazelas bu yüzden, o zaman neyle karıştırdığımı bilmiyorum. Her durumda açıklama için teşekkürler.
terdon

4

Evet, GNU sedFreeBSD'den farklı sedolarak \t, normal ifadeler gibi ANSI C kaçış dizilerini yorumlamaz .

Bu durumda en az ortak payda almanın bir yolu kullanmaktır printf.

tab="$(printf '\t')"
printf '\t\n' | sed 's/'"${tab}"'/,/g'
printf '\t\n' | sed 's/'"$(printf '\t')"'/,/g'

sed -iYerinde dosya düzenlemelerinin davranışı, bir anahtar veya seçenek anahtarı hemen takip ederse uyumlu hale getirilebilir -i, örneğin sed -i -e 's/x/X/g' filehem GNU sedhem de FreeBSD için çalışır sed.

FreeBSD'nin sed(FreeBSD 8.1 veya daha yeni) son sürümlerinde -rGNU ile uyumluluğu artırmak için geçiş vardır sed.

(Ayrıca, POSIX karakter sınıflarının seddüzenli ifadelerde kullanılması uyumluluğu da sağlamanın iyi bir yoludur).

Alternatif, POSIX uyumlu bir seduygulama için bkz: küçültülmüş - daha küçük, daha ucuz, daha hızlı bir SED uygulaması .


3

Şunun TAByerine gerçek bir karakter kullanmalısınız \t:

sed 's/    /,/g' inputFile.txt > outputFile.csv

Başka bir soru için Stephane'nin bu yoruma bakın .

Aşağıdaki makale de ilginizi çekebilir:

İlgili bölümü teklif ediyorum:



Normal İfade Farkları Normal ifade sözdizimi, SED'in farklı sürümleri arasında ince bir şekilde farklılık gösterir. Farklılıkların çoğu, ASCI zili ve form beslemeleri gibi yazdırılmayan karakterlerle eşleştirmek için kullanılan özel kaçış kalıplarını içerir.


0

Giriş yaptıktan sonra bir sonraki duyuruyu görüyorum ve kaydediyorum. Diğerleri için de yararlı olacağını umuyoruz

Bir dosyayı yerinde düzenlemek için sed (1) kullanmak ister misiniz? Her 'e' yerine 'o' koymak için 'foo' adlı bir dosyada şunları yapabilirsiniz:

sed -i.bak s/e/o/g foo

'Foo.bak' adlı bir dosyada orijinalin bir yedeğini alırsınız, ancak yedekleme istemiyorsanız:

sed -i '' s/e/o/g foo

-iseçenek oldu zaten örtülü olsa
Jeff Schaller
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.