BSD sed'e \ n ve \ t gibi kaçış dizilerini yorumlamasını nasıl söyleyebilirim?


14

Ben sedGNU yanı sıra BSD ile uyumlu olmasını istiyorum bir sed değiştirme komutu var sed. Genişletilmiş düzenli ifadeler bu durumda onlara ihtiyaç duymadığım için sorun değil. Birincil sorunum, iki seds'nin değiştirme dizelerindeki karakter kaçış dizilerini yorumlama biçimindeki farktır . Yedek dizem sekmeler ve yeni satırlar içeriyor ve bakım kolaylığı için komut dizelerinde görünmelerini istiyorum, ancak BSD sedkaçış dizilerini yorumlamıyor ve GNU sed yapıyor . sedBSD'deki bu kaçış dizilerini yorumlamayı öğretmenin uygun yolu nedir ? Aşağıdaki iki parçacık sorunumu özetler:

GNU sed

echo ABC | sed 's/B/\n\tB\n'

yeilds

A
    B
C

BSD sed

echo ABC | sed 's/B\n\tB\n'

verim

AntBnC

Açıkça görülüyor \nve \tBSD tarafından kaçış dizileri olarak yorumlanmıyorsed

Şimdi soruma. BSD sedkılavuzuna göre :

Yeni dizede yeni satır karakteri belirtmek için, karakterden önce ters eğik çizgi kullanın.

Bu, gerçek bir satırsonundan önce ters eğik çizgi kullanmam gerektiğini mi ima ediyor ? Değiştirme metninde olduğu sedgibi kaçış dizilerini yorumlamayı öğretmenin uygun yolu nedir \n?


2
BSD sed GNU sed değildir ve çıktıdaki bu kaçışları desteklediğini düşünmüyorum. Değişmez karakterler eklemeniz, GNU sed yüklemeniz veya awk gibi bu tür kaçışları destekleyen bir şeye geçmeniz gerekir.
jw013

@ jw013, ikisi arasındaki farkı açıklığa kavuştum. GNU sed kurulumu bir seçenek değildir. Aralarında ne olduğumu başarmak için ikisi arasında yeterince ortak bir zemin bulmayı umuyordum sed. Sonunda awk kullanmak muhtemelen mantıklı olacaktır. Öyleyse alıntıladığım BSD sed manpage'in yorumu hakkında ne düşünüyorsunuz?
ephsmith

2
Evet, değişmez sekmeler ve yeni satırlar kullanmanız gerekecek ve yeni satırlarda da bunlardan önce, temelde yalnızca bir satır devam mekanizması olan bir ters eğik çizgi kullanmalısınız.
jw013

@ jw013, harika yanıtlarınız için teşekkürler. Bu noktada, uğruna bakım için, tavsiyenizi alacağım ve çözümümü awk olarak yeniden çalışacağım.
ephsmith

İyi bir seçim - awk şu anda kabul edilen cevaptan çok daha iyi bir plan :)
jw013

Yanıtlar:


6

Taşınabilir komut dosyaları yazmanız gerekiyorsa, POSIX standardındaki özelliklere (yani Tek Unix, yani Açık Grup Tabanı Belirtimi) bağlı kalmalısınız . Sayı 7 aka POSIX-1.2008 en son sürümdür , ancak birçok sistem henüz benimsemeyi bitirmedi. Sayı 6 aka POSIX-1.2001 genel olarak tüm modern birimler tarafından sağlanmıştır.

In sed gibi kaçış dizilerinin anlamı \tve \nbir haricinde taşınabilir değildir regex , \nbir yeni satır anlamına gelir. Bir skomutun yerine geçen metinde \ntaşınabilir değildir, ancak bir satırsonu-satırsonu satırını bir satırsonu anlamına gelmek için kullanabilirsiniz.

Sekme karakteri (veya sekizlik olarak ifade edilen başka herhangi bir karakter) oluşturmak için taşınabilir bir yol ile tr. Karakteri bir kabuk değişkeninde saklayın ve bu değişkeni sed snippet'ine koyun.

tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
  sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}

Yeni satırların normal ifadelerde ve sikame metinlerde farklı şekilde ifade edilmesi gerektiğini bir kez daha unutmayın .

Bunun yerine awk kullanmak isteyebilirsiniz . Sekizli kaçışlar da dahil olmak üzere ters eğik çizgi kaçışlarına, \oooher dizgi hazırlığında izin verir .


7

$'...'Dizeyi geçmeden önce kaçışları yorumlamak için bash tırnak işaretini kullanabilirsiniz sed.

Bash man sayfasından:

   Words  of  the  form  $'string'  are  treated specially.  The word
   expands to string, with backslash-escaped characters  replaced  as
   specified  by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the eight-bit character whose  value  is  the  octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadeci-
                 mal value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had
   not been present.

   A  double-quoted  string  preceded by a dollar sign ($) will cause
   the string to be translated according to the current  locale.   If
   the  current locale is C or POSIX, the dollar sign is ignored.  If
   the string is translated and replaced, the replacement is  double-
   quoted.

3

Bu Yığın Taşması üzerinde cevaplandı:

/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

Tam olarak jw013'ün söylediği şey.

Değişmez sekme eklemek için ctrl+ yazın VTab.


referans için teşekkürler. Google aramalarımın bu bağlantıyı döndürmediğinden nefret ediyorum: D
ephsmith

1
Ctrl-V sekme önerisi kabuğa bağlıdır, örneğin balıklarda çalışmaz.
anddam

Asla balık kullanmadan farkında değilim, ama bilmek güzel.
Bahama
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.