Hızlı cevap
sed ':a;N;$!ba;s/\n/ /g' file
- : a 'a' etiketi oluştur
- N desen uzayına sonraki satırı ekler
- , $! son satır değilse , ba dalı (git) 'a' etiketi
- s yerine , / \ n / regex yeni satır , / / boşluk , / g global eşleşme (olabildiğince çok)
sed, son satıra ulaşana kadar adım 1 ila 3 arasında döngü yapar ve tüm satırlar, sed'in tüm karakterlerin yerine geçeceği desen alanına sığdırır \ n
Alternatifler
Tüm alternatiflerin, sed'den farklı olarak , işleme başlamak için son satıra ulaşması gerekmeyecek
ile bash , yavaş
while read line; do printf "%s" "$line "; done < file
ile Perl , sed benzeri hızı
perl -p -e 's/\n/ /' file
ile tr , daha hızlı sed , bir karakter yerine sadece
tr '\n' ' ' < file
ile macun , tr -like hız, bir karakter yerine sadece
paste -s -d ' ' file
ile awk'ın , tr benzeri hızlı
awk 1 ORS=' ' file
"Echo $ (<file)" gibi diğer alternatifler yavaştır, yalnızca küçük dosyalar üzerinde çalışır ve işleme başlamak için tüm dosyayı işlemesi gerekir.
5.10. \ N Escape
dizisini kullanarak neden bir yeni satırı eşleştiremiyorum veya silemiyorum ? Neden \ n kullanarak 2 veya daha fazla satırı eşleştiremiyorum?
\ N hiçbir zaman satır sonundaki satırsonu ile eşleşmeyecektir, çünkü
satır
desen alanına yerleştirilmeden önce satırsonu her zaman çıkarılır . Desen alanına 2 veya daha fazla satır girmek için
, 'N' komutunu veya benzer bir şeyi kullanın ('H; ...; g;' gibi).
Sed şu şekilde çalışır: sed her seferinde bir satır okur, sondaki
yeni satırı keser
, sed komut dosyasının adresleyebileceği veya değiştirebileceği desen alanına kalanları koyar ve desen alanı
yazdırıldığında stdout'a yeni bir satır ekler (veya bir dosyaya). Eğer
model alanı tamamen veya kısmen 'd' ve 'D' ile silinmiş olan,
yeni satır olduğunu olmayan bu gibi durumlarda ilave edildi. Böylece, komut dosyaları
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
ASLA işe yaramaz, çünkü
çizgi desen alanına yerleştirilmeden önce sondaki satırsonu kaldırılır
. Yukarıdaki görevleri gerçekleştirmek için, aşağıdaki
komut dosyalarından birini kullanın:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
GNU sed dışındaki sed sürümlerinin
desen tamponunun boyutu ile ilgili sınırları olduğundan , burada Unix 'tr' yardımcı programı tercih edilecektir.
Dosyanın son satırı bir satırsonu içeriyorsa, GNU sed
bu satırsonu çıktıya ekler ancak diğerlerini siler, tr ise
tüm satırları siler.
İki veya daha fazla satırlık bir bloğu eşleştirmek için 3 temel seçenek vardır:
(1) desen satırına Sonraki satırı eklemek için 'N' komutunu kullanın;
(2) geçerli satırı
Bekletme alanına eklemek için 'H' komutunu en az iki kez kullanın ve ardından çizgileri
x, g veya G ile bekletme alanından alın ; veya (3)
belirtilen iki adres arasındaki satırları eşleştirmek için adres aralıklarını kullanın (bkz. bölüm 3.3, yukarıdaki) .
Seçenekler (1) ve (2), desen alanına
istenen şekilde adreslenebilecek bir \ n yerleştirir ('s / ABC \ nXYZ / alphabet / g'). Bir
satır bloğunu silmek için 'N' kullanımına örnek olarak bölüm 4.13'te
(" Ardışık belirli satır bloğunu nasıl silebilirim ?") Görünür. Bu
örnek, delete komutunu
'p' (yazdır), 'i' (ekle), 'c' (değiştir), 'a' (ekle)
veya 's' (yerine) gibi başka bir şeye değiştirerek değiştirilebilir. .
Choice (3) bir \ n desen uzaya koymak olmaz, ancak o yok
o değil mi olabilir, böylece üst üste çizgilerin bir blok maç
bile gerek \ n aradığınızı bulmak için. GNU sed
sürüm 3.02.80 artık bu sözdizimini desteklediğinden:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
geleneksel '/ buradan /, / oraya / {...}' aralık
adreslerine ek olarak, \ n kullanımından tamamen kaçınmak mümkün olabilir.
tr
tek bir karakter için tek bir karakter yerine, sadece iş için doğru araçtır, yukarıdaki örnek newline yerine bir boşluk gösterir .. Yani yukarıdaki örnekte, tr işe yarayabilir .. Ama daha sonra sınırlı olacaktır.