Aynı hatta çok satırlı çıktı (tek çıktı) yazdırmanın bir yöntemi var mı?
Örneğin, çıktı:
abc
def
qwerty
Yazdırmak mümkün mü:
abcdefqwerty
Aynı hatta çok satırlı çıktı (tek çıktı) yazdırmanın bir yöntemi var mı?
Örneğin, çıktı:
abc
def
qwerty
Yazdırmak mümkün mü:
abcdefqwerty
Yanıtlar:
İ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 echo
veya ile tekrar ekleyebilirsiniz printf '\n'
, örneğin:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
Ç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
Çok satırlı çıktınızı awk
awk '{printf "%s",$0} END {print ""}'
veya kullanın sed
:
sed ':a;N;$!ba;s/\n//g'
$ 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
Ayrıca your_command | paste -sd ''
sondaki satırsonu korunur.
Bunun için Perl kullanmak istiyorsanız, chomp
işlevini kullanabilirsiniz :
perl -pe chomp
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 -p
veya perl -n
temelli 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
. perl
Komut 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ı. chomp
Bununla birlikte, Perl kullanıyorsanız bunun için tam olarak doğru araç ve bence amacınınkinden chomp
daha açık olduğunu düşünüyorum s/\n//
. Sonuçta hangisinin daha iyi olduğuna dair muhtemelen objektif bir cevap yoktur.
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 echo
ya 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, perl
son satırsonunun kendisini de yazdırabilirsiniz. Çevreleyen gibi perl
ve echo
komutlar {
;}
, 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
Yalnızca kabuk yolunu kullanma:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.txt
gö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.
printf
+cat
+perl
açılan çok daha iyiperl -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.