sed
adlı kullanıcının API'si ilkeldir - ve bu tasarım gereğidir. En azından, etti kalmıştır tasarımıyla ilkel - bu söyleyemem başlangıcında ilkel tasarlanmış olup olmadığı. Çoğu durumda, sed
çalıştırıldığında başka bir sed
komut dosyası çıktısı yapacak bir komut dosyasının yazılması gerçekten basit bir konudur. ve / veya sed
gibi makro ön işlemcileri tarafından bu şekilde uygulanır .m4
make
(Aşağıdaki son derece varsayımsal bir kullanım örneğidir: bir çözüme uyacak şekilde tasarlanmış bir sorundur. Size bir gerginlik gibi geliyorsa, muhtemelen bunun nedeni budur, ancak bu daha az geçerli kılmaz.)
Aşağıdaki girdi dosyasını göz önünde bulundurun:
cat <<"" >./infile
camel
cat dog camel
dog cat
switch
upper
lower
Yukarıdaki girdi dosyasındaki her uygun kelimenin kuyruğuna -casesed
kelimesini ekleyecek bir komut dosyası yazmak isteseydik, ancak uygun bağlamda bir satırda bulunabilseydik ve bunu olabildiğince verimli yapmak istedik ( hedefimiz olması gerektiği gibi, örneğin bir derleme işlemi sırasında) o zaman regexp'leri mümkün olduğunca uygulamaktan kaçınmalıyız ./
/
Yapabileceğimiz bir şey şu anda sistemimizdeki dosyayı önceden düzenlemek ve sed
derleme sırasında asla aramamaktır. Ancak, dosyadaki bu kelimelerden herhangi biri yerel ayarlara ve / veya derleme zamanı seçeneklerine dayalı olarak dahil edilmeli veya eklenmemelidirse, bunu yapmak büyük olasılıkla istenen bir alternatif olmayacaktır.
Yapabileceğimiz başka bir şey, dosyayı şimdi regexps'e karşı işlemektir. sed
Normalde uzun vadede çok daha etkili bir yol olan satır numarasına göre düzenlemeleri uygulayabilen bir komut dosyası üretebilir ve derlememize dahil edebiliriz.
Örneğin:
n=$(printf '\\\n\t')
grep -En 'camel|upper|lower' <infile |
sed " 1i${n%?}#!/usr/heirloom/bin/posix2001/sed -nf
s/[^:]*/:&$n&!n;&!b&$n&/;s/://2;\$a${n%?}q"'
s/ *cat/!/g;s/ *dog/!/g
s| *\([cul][^ ]*\).*|s/.*/\1-case/p|'
... çıktıyı bir sed
senaryo şeklinde yazan ve ...
#!/usr/heirloom/bin/posix2001/sed -nf
:1
1!n;1!b1
1s/.*/camel-case/p
:2
2!n;2!b2
2!!s/.*/camel-case/p
:5
5!n;5!b5
5s/.*/upper-case/p
:6
6!n;6!b6
6s/.*/lower-case/p
q
Bu çıktı, makinemdeki yürütülebilir bir metin dosyasına kaydedilip şu şekilde ./bang.sed
çalıştırıldığında ./bang.sed ./infile
, çıktı şu şekildedir:
camel-case
upper-case
lower-case
Şimdi bana sorabilirsiniz ... Bunu neden yapmak isteyeyim ki? Neden sadece grep
maçları tutturmuyorum? Kim deve kasasını kullanıyor ki? Ve her soruya sadece cevaplayabiliyorum, hiçbir fikrim yok ... çünkü bilmiyorum. Bu soruyu okumadan önce ben şahsen multi-! spec ayrıştırma gereksinimi - Ben oldukça temiz bir yakalamak olduğunu düşünüyorum.
Çoklu! şey yoktu çok - gerçi hemen bana mantıklı sed
şartname basitçe ayrıştırılır ve basitçe doğru içindir oluşturulan sed
komut. Muhtemelen bu bağlamda daha anlamlı olmak \n
için gerekli ewline sınırlayıcılarını bulacaksınız ve [wr:bt{]
bu fikri aklınızda tutarsanız, spesifikasyonun diğer bazı yönlerini daha iyi anlayabilirsiniz - ( :
adresleri kabul q
etmemek ve reddetmek gibi) kabul fazla 1) .
Örnekte ben belli bir formu yazma yukarıda sed
sadece edebilirsiniz senaryo hiç bir kere okunabilir. Sıkı bakarsanız sed
, düzenleme dosyasını okurken bir komut bloğundan diğerine ilerlediğini fark edebilirsiniz - düzenleme dosyası ile tamamen bitene kadar asla düzenleme komut dosyasından ayrılmaz veya tamamlanmaz.
Ben bunu multi-! adresler bu bağlamda diğerlerinden daha yararlı olabilir, ancak dürüst olmak gerekirse, onu çok iyi bir şekilde kullanabileceğim tek bir durum düşünemiyorum - ve sed
çok fazla. Ayrıca, GNU / BSD'lerin sed
her ikisinin de belirtildiği gibi ele alamamasının önemli olduğunu düşünüyorum - bu muhtemelen çok talep edilen spesifikasyonun bir yönü değildir ve bu yüzden bir uygulama göz ardı ederse hatalarının @ kutusunun sonuç olarak çok korkunç.
Dedi ki, başarısızlık belirtildiği gibi bu işlemek için olan uyum için herhangi bir uygulama için bir hata hangi miş ve ben için denir edilir burada alakalı dev kutuları bir e-posta çekim düşünüyorum bu yüzden, ben eğer yapmazsan bunu yapmak niyetinde.
!
bir geçiş işlevi görür/pattern/!!
, aynı/pattern/
ve/pattern/!!!
aynıdır/pattern/!
. FreeBSD'de çoklu!
, tekli ile aynıdır.