2012-11-21 15 views
6

Veritabanına eklemek için bağlama günlüklerini temizlemek için bir kabuk komut dosyasının parçası olarak sed çalıştırıyorum. sed komutlarınSED'yi bir satırın ilk 10 karakteriyle sınırlandırma

biri şu: Bir awk ifadesi için ayırıcı olarak:

sed -i 's/-/:/g' $DPath/named.query.log 

Bu aynı zamanda kullanıyorum (tire içeren tüm kaynak isteklerinde bozan olarak sorunlu olduğu ortaya çıkıyor daha aşağı).

Benim sorum, yukarıdaki sed komutunu, hattın sadece ilk on karakteriyle nasıl sınırlayabilirim? Bunu yapan belirli bir anahtar görmedim, ve RegEx ile işe yarayan bir tane geliştirmeye bile başlamaya yetecek kadar yakınım yok. Modelin bir kaynak isteğinin bir parçası olabileceğinden, regex'i önceki sayılarla eşleştirmek için kullanamıyorum. Heck, #### - ## - ## için desen eşleştirmesi bile kullanamıyorum çünkü tekrar, kaynağın bir parçası olabilir.

Herhangi bir fikir için minnettarız.

cevap

2

sadece çıktısı: Emin değilim

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file 
+0

Efendim, bunu yapacağımı düşünüyorum. Çok teşekkür ederim! – MikeH

+2

Ya da (test edilmemiş) perl -pe 'substr ($ _, 0, 10) = ~ s /:/-/g' dosya ' – tripleee

+0

@tripleee: (Denenmemiş) yorumunuz benim için çalışmıyor (ama ben perl bilmiyorum). –

0

Aşağıdaki yapabilirsiniz:

cut -c 1-10 $DPath/named.query.log | sed -i 's/-/:/g' 

kesim statemnt o dosyadaki her cümlenin ilk 10 karakter alır. Bunun çıktısı bir dosyaya aktarılmalıdır. Bugün itibarıyla bu awk ile basit sizin terminali [hemen her zaman] It

+2

i OP değiştirmek istedik DÜŞÜN - "daha uzun bir çizgi sadece ilk 10 karakter s, 10 karakter çizgisini kesecek ve sonra tüm değiştirmez "" - "lar. Ayrıca, sed'in "-i" nin hiçbir dosyayı değiştirmeyeceğini merak ediyorum .... –

1

nasıl sed o kendi başına, ancak, sana biliyorum do yapmak paste -d"\0" <(cut -c1-10 $DPath/named.query.log | sed 's/\-/:/g') <(cut -c11- $DPath/named.query.log)

+0

Bu, çıktıyı dosyaya değil ekrana yayar, ancak bu da işe yarayabilir. Yazı için teşekkürler :) – MikeH

2

Ben en kısa çözümü düşünmek ve belki en basit, daha doğrusu awk [koğuş] den, sed kendisi tarafından sağlanır: böylece gibi, ilk 10 karakter sonra tekrar diğer yapıştırın sed feed edebilirsiniz:

sed "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" 

Açıklama:

  • (h)
  • (ler) (tüm kalıp boşluğuna) ikame yapmak
  • (G) tutma alanı eklemek, tutma alanı için her kopyaayırıcı
  • (ler) \n'dan sonra onuncuya kadar olan karakterleri siler, ancak ilk on'u korur.

Bazı test kodu:

echo "--------------------------------" > foo 
sed -i "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" foo 
cat foo 
::::::::::---------------------- 
+1

İyi! Belki de hafif bir gelişme "sed" h; y/- /: /; G; s/^ \ (. \ {10 \} \). * \ N. \ {10 \}/\ 1/'' – potong

+0

@ potong : Evet haklısın. * Ancak bazı eski sistemler bu sözdizimini desteklemez. * Ve * daha az açık. –

+0

@potong: Ama çözümün benimkinden * daha kısa *, yedi karakterle (gereksiz olanı göz ardı ederek). 'Y' bir karakteri kurtardı. –

İlgili konular