it-swarm-tr.com

Mac OSX'deki sed ile diğer "standart" sed arasındaki farklar?

Boş bir satırı diğer iki içerik satırı ile değiştirmek için bir sed komutu hakkında bu sor için bu sitede sağlanan bir cevap kullanarak bazı sorunlar yaşıyorum ve Mac'teki sed komutu getirildi İşletim sistemi (benim için 10.6.7) farklı. Bunun olduğunu düşünmüyorum, ancak bu sitedeki başkalarının farklı düşünüp düşünmediğini merak ediyordum.

67
Peter Grill

Shell yardımcı programlarının davranışı, unix varyantları arasında küçük farklılıklar gösterir. karmaşıkgeçmiş ile birçok nix varyantı vardır. POSIX standart ve onun üst kümesi Tek UNIX belirtimi gibi standardizasyon çabaları vardır. Günümüzde çoğu sistem, Tek UNIX Spesifikasyonu sürüm olarak da bilinen POSIX: 2001'i küçük sapmalar ve birçok uzantı ile uygulamaktadır. Tek Unix belirtimi bir öğretici değildir, ancak bir komutun ne yaptığına dair bir fikriniz varsa sürüm 3 okunabilir. Bazı özelliklerin standart mı yoksa belirli bir sistemin uzantısı mı olduğunu öğrenmek için danışabilirsiniz.

Unix kullanıcılarının çoğunluğu Linux kullanıyor ve başka bir varyant kullanmadı. Linux, genellikle standardın birçok uzantısı olan GNU yardımcı programlarıyla birlikte gelir. Böylece, Linux üzerinde çalışan ancak diğer birimlerde çalışmayan oldukça fazla kod bulacaksınız, çünkü bu uzantılara dayanıyor.

Sed ile ilgili olarak, her sistemin desteklemesi gereken minimum değer için sed Single Unix belirtimi , uygulamanızın desteklediği öğeler için sisteminizdeki man sayfası adresine bakın ve - GNU sed manual çoğu insanın kullandığı şey için.

GNU sed içindeki standart dışı uzantılardan biri, birlikte çalışan birden çok komutu destekliyor. Örneğin, bu GNU sed programı, a, ancak önce b değerini c olarak değiştirir:

sed -ne '/a/ {s/b/c/g; p}'

{ Ve } Aslında ayrı komutlardır, bu nedenle tam taşınabilirlik için bunları ayrı satırlarda (dosyada) veya ayrı -e Bağımsız değişkenlerinde ( Komut satırı). { 'Dan sonra bir komut ayırıcısının bulunmaması ve ; Komutunun komut ayırıcı olarak kullanılması yaygın uzantılardır. } Öncesi bir komut ayırıcısının olmaması daha az yaygın bir uzantıdır. Bu standart uyumludur:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Bu standart dışıdır ancak yaygın olarak kabul edilir:

sed -ne '/a/ { s/b/c/g; p; }'

Standart olmayan ancak yaygın bir diğer uzantı, s değiştirme metninde yeni satır anlamına gelmek için \n Kullanılmasıdır (normal ifadede kullanım standarttır). Taşınabilir yöntem sed komut dosyasına ters eğik çizgi-newline eklemektir. Bir başka yaygın uzantı, regexps içindeki \+, \? Ve \| Bir veya daha fazla, en fazla bir ve alternatif anlamına gelir; taşınabilir temel düzenli ifadeler bunlardan hiçbirine sahip değil. Örneğin, birinci komut, bitişik boşluk alanlarını bir satırsonu ile değiştirmenin taşınabilir olmayan bir yoludur; ikinci komut standartlara uygun bir eşdeğerdir.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

OS X şu anda 2005'ten itibaren bir FreeBSD sed ile geliyor. Aşağıdaki farklılıkların çoğu diğer BSD sed sürümleri için de geçerlidir.

OS X'in sed'i ERE için -E kullanır ve GNU sed -r kullanır. -E, GNU sed içindeki -r için bir takma addır (4.2'de eklenmiştir, 4.3'e kadar belgelenmemiştir). FreeBSD ve NetBSD sed'in daha yeni sürümleri hem -E hem de -r'yi destekler. OpenBSD sed yalnızca -E öğesini destekler.

-i '', OS X'in sed ile çalışır ancak GNU sed ile çalışmaz. -i GNU sed, NetBSD'nin son sürümleri, OpenBSD sed ile çalışır, ancak OS X'in sed'i ile çalışmaz. -i -e her ikisiyle de çalışır, ancak FreeBSD durumunda sed, orijinal dosyanın yedeğini, dosya adına -e eklenmiş olarak yapar (ve sed öğesine birden fazla ifade iletmeniz gerekmez).

GNU sed \t, \n, \001, \x01, \w ve \b gibi kaçış dizilerini yorumlar. OS X'in sed ve POSIX sed yalnızca \n değerini yorumlar (ancak s yerine geçmez).

GNU sed, BRE'de \|, \+ ve \? öğelerini yorumlar, ancak OS X'in sed ve POSIX sed'lerini kullanmaz. \(, \), \{ ve \} POSIX BRE.

GNU sed ; veya newline'ın }'dan önce çıkarılmasına izin verir, ancak OS X'in sed'i izin vermez.

i (insert), a (append) ve c (değişiklik), ardından OS X'in sed ve POSIX sed öğelerinde ters eğik çizgi ve yeni satır içermeli, ancak GNU sed. GNU sed, i, a veya c tarafından eklenen metinden sonra eksik bir yeni satır ekliyor, ancak OS X'in sed öğesi eklenmiyor. Örneğin sed 1ia, sed $'1i\\\na\n' 'a GNU alternatifidir.

Örneğin printf a|sed -n p, OS X'in sed'e yeni satır ekler ancak GNU sed'e yeni satır ekler.

OS X'in sed özelliği I (büyük/küçük harf duyarlı) veya M (çok satırlı) değiştiricileri desteklemez. FreeBSD sed'in yeni sürümleri I.

OS X'in sed özelliği -s (--separate), -u (--unbuffered) veya -z (--null-data) işlevlerini desteklemez.

GNU sed tarafından desteklenmeyen bir BSD seçeneği -a şeklindedir ve bu da w dosyasını bir dosyayı kısaltmak yerine bir dosyaya ekler.

OS X'in sed ile çalışmayan GNU sed komutlarına örnekler:

sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a Shell command
sed -n l0 # 0 disables wrapping
69
Lri

Hem Linux hem de Mac'te aynı komut dosyasının çalışmasını sağlamanın en iyi yolu:

sed -i.bak -e 's/foo/bar/' -- "${TARGET}" &&
  rm -- "${TARGET}.bak"
6
vikrantt