Çok satırlı çıktıyı aynı satıra nasıl yazdırabilirim?


Yanıtlar:


13

İle verilen bir kümedeki tüm karakter oluşumlarını kaldırabilirsiniz tr -d. Yeni satır karakterini kaldırmak için şunu kullanın:

tr -d '\n'

Her zaman olduğu gibi, dosyalardan ve diğer işlemlerden okumak veya bunlara yazmak için giriş ve çıkış yeniden yönlendirmesini ve kanallarını kullanabilirsiniz.

Eğer son satırsonu tutmak istiyorsanız echoveya ile tekrar ekleyebilirsiniz printf '\n', örneğin:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

Çok şekilde. Örneklemek için, örneğinizi şu konuma kaydettim file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

Bu, sonuncusu da dahil olmak üzere tüm yeni satır karakterlerini kaldırır. Bunun yerine şunları yapmak isteyebilirsiniz:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

Bence printf+ cat+ perlaçılan çok daha iyi perl -pe 's/\n//;END{printf "\n"}' input.txt Tek işlem, komut ikamesi ve tırnak ile karışıklık ve UUOC ile ele alınmaktadır. Belki.
Sergiy Kolodyazhnyy

7

Çok satırlı çıktınızı awk

awk '{printf "%s",$0} END {print ""}'

veya kullanın sed:

sed ':a;N;$!ba;s/\n//g'

Örnek çalışma

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

İlave okumalar: AWK · serverfault.SE kullanarak satır sonunu kaldırma



2

Bunun için Perl kullanmak istiyorsanız, chompişlevini kullanabilirsiniz :

perl -pe chomp

İlgilenenler için biraz daha ayrıntı.

Sonraki argümanlar olarak bir veya daha fazla dosya adı iletebilirsiniz.

perl -pe chomp file1 file2 file3

Bazı durumlarda bunu yapmak istemeyebilirsiniz , ancak bunun yerine bu komuta yönlendirebilir veya yönlendirebilirsiniz. (Bu beceriler - ve bu uyarı - hepsi başka perl -pveya perl -ntemelli bir çözüm için de geçerlidir.)

Bu nedenle, çıktıyı çalışır durumda işlemek istiyorsanız some-command:

some-command | perl -pe chomp

Bu, terdon cevabındaki Perl komutundan potansiyel olarak daha hızlıdır . Yeni satır karakterleri (ile temsil edilir \n) yalnızca bu durumda satırların sonunda görünür - çünkü Perl her satırın nerede biteceğine karar vermek için ne kullanıyorlar. s/\n//satırın tamamını satır sonları için arar chomp, sondaki satır kaldırılır (eğer varsa, son satırın satır sonu olabilir veya olmayabilir).

Performans gerçekten tercih edilecek ana neden olmayabilir chomp. perlKomut Terdon cevabı çok uzun çizgilerle büyük bir dosyası işlenirken sürece sadece biraz daha yavaş olacaktır. Ve hıza ihtiyacınız varsa, David Foerster'ın yolu hala daha hızlı. chompBununla birlikte, Perl kullanıyorsanız bunun için tam olarak doğru araç ve bence amacınınkinden chompdaha açık olduğunu düşünüyorum s/\n//. Sonuçta hangisinin daha iyi olduğuna dair muhtemelen objektif bir cevap yoktur.

Son satırsonu yazdırma.

Ancak, $( )yalnızca bir satırsonu yazdırılmasını sağlamak için komut yerine koyma ( ) kullanımına karşı öneriyorum . İşlediğiniz metin kısa olmadığı sürece, bu oldukça yavaş olacaktır - tüm metni bir kerede toplayıp yazdırmak zorundadır - ve komutunuzu anlamayı zorlaştırır. Bunun yerine David Foerster'ın önerdiği ve koştuğu gibi echoya da printf '\n'sonrasında yapabilirsiniz.

perl -pe chomp; echo

Sen boru Eğer gelen veya (David Foerster gösterdiği gibi) yeniden yönlendirme gelen bu komutla, o zaman içine alın edebilir { ;}böylece komutun çıktısı birlikte alınır söyledi. Sadece terminale yazdırıyorsanız, tam olarak yukarıda gösterildiği gibi çalıştırabilirsiniz. Sen boru veya yönlendirme durumunda bile işe yarar için komuta çünkü echo/ printf '\n'aslında herhangi bir giriş okumuyor. Yani, bu işe yarar:

some-command | perl -pe chomp; echo

Buradayken şunları kaldıramazsınız { ;}:

{ perl -pe chomp; echo; } | some-other-command

İsterseniz, perlson satırsonunun kendisini de yazdırabilirsiniz. Çevreleyen gibi perlve echokomutlar { ;}, bu yaklaşım çalışır bile sen boru veya yönlendirme dan kendisine (ve benzeri tüm yaklaşımların, bu eserler sen boru için de buna):

perl -wpe 'chomp; END { print "\n" }'

Terdon'un cevabındaki komutun, son satırsonu yazdırma yöntemleriyle de iyi çalıştığını unutmayın. Örneğin:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } aynı süreç, sondaki yankı ekleme üzerinde küçük bir avantaj
Sergiy Kolodyazhnyy

1

Yalnızca kabuk yolunu kullanma:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt

1

Bu cevabın oluşturmaya çalıştığınız soruna bir çözümü var: Neden bash $ (cat dosyası) içinde \ n kaldırıyor?

Yazdığınızda şunu cat myfile.txtgörürsünüz:

abc
def
ghi

Ancak yazdığınızda şunu echo $(cat myfile.txt)görürsünüz:

abc def ghi

Bu yöntemin eskiden ayrı yeni satırların olduğu bir boşluk eklediğini unutmayın. Bu, çıktının okunmasını kolaylaştırır, ancak soru kapsamınıza kesinlikle uymaz.


0

Bash kullanıyorsanız, harici bir alet kullanmadan yapabilirsiniz.

x=($(echo line1; echo line2))
echo "${x[@]}"

Sonuç:

line1 line2

İlk komut çok satırlı çıktıyı bir diziye dönüştürürken, ikinci komut diziyi bir satırda birden çok bağımsız değişkene genişletir.

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.