Paksa baris baru dengan pencetakan wildcard kucing

9

Saya ingin menggunakan cat dengan wildcard di bash untuk mencetak beberapa file kecil (setiap file satu kalimat) ke output standar. Namun, isi file yang terpisah tidak dipisahkan oleh baris baru, yang ingin saya baca dengan mudah.

Bagaimana saya bisa menambahkan pembatas file semacam ini untuk perintah ini?

lennyklb
sumber

Jawaban:

12

Tetapkan fungsi shell yang menghasilkan akhir baris setelah setiap file dan menggunakannya sebagai ganti cat:

endlcat() {
  for file in "$@"; do
    cat -- "$file"
    echo
  done
}

maka Anda bisa menggunakannya endlcat *.

The forLoop loop atas semua argumen yang disediakan ( $@) yang sudah lolos oleh shell ketika Anda menggunakan wildcard seperti *. The --diperlukan untuk tidak tersedak nama file dimulai dengan tanda hubung. Akhirnya echomenghasilkan baris baru.

Marco
sumber
Tampaknya agak jelas untuk menggunakan iterasi di belakang! Saya pikir mungkin ada bendera di kucing, tetapi ini juga berhasil! Terima kasih.
lennyklb
Anda tidak perlu in "$@"- itu implisit.
l0b0
4
eksplisit itu baik untuk keterbacaan.
cas
5

Cukup gunakan satu lingkaran alih-alih sederhana cat:

for file in /path/to/targetdir/*; do
    echo "-------- $file -------"
    cat "$file" 
done
terdon
sumber
Bekerja seperti jawaban yang diterima, tetapi yang satu juga memiliki langkah berikutnya ke commandline jadi saya menerima yang lain.
lennyklb
3

Jika Anda ingin nama file antar file, gunakan tail:

tail -n +1 ./*

(Jika anda ingin tacbukan cat, beberapa tailimplementasi memiliki -rpilihan untuk setara tacfungsional)

cuonglm
sumber
3

Ini akan berhasil:

sed '' -- *

Anda tidak memerlukan loop shell atau sebaliknya, dan ini akan selalu mengikuti output file dengan \newline - kecuali mungkin yang terakhir.

Kalau tidak, jika Anda ingin baris kosong menjadi output antara output setiap file, ini bisa berfungsi:

bpaste(){
    eval "paste -'sd\n' -- $(x=0;for f do printf "\"\${$((x+=1))}\" - ";done)"
}   </dev/null

Itu akan selalu mengikuti output file dengan \newline dan baris kosong tambahan .

Anda bisa menyebutnya seperti:

bpaste *
mikeserv
sumber
@cuonglm - op menginginkan baris baru antar file. ini memastikan baris baru antar file.
mikeserv
@cuonglm - Anda harus mencoba lagi. for n in 1 2 3; do printf "$n" >"$n"; done; sed '' -- [123]
mikeserv
@ cuonglm - ada yang sedharus selalu mencetak \newline sebelum mencetak apa pun, baris terakhir dari file terakhir mungkin tidak mendapatkan \newline ditambahkan. saya berani bersumpah ive menjawab pertanyaan ini sebelumnya.
mikeserv
@cuonglm - saya tidak mengerti apa yang Anda maksud. sedikit cangkang itu aku baru saja memberimu cetakan 1\n2\n3. berhasil. selalu begitu. apa yang dicetak untuk Anda?
mikeserv
1
@ DennisWilliamson: Menggunakan \ndi RHS tidak standar. Anda bisa menggunakannya sed -e '$G'.
cuonglm
2

Mirip dengan jawaban @terdon , jika Anda lebih suka melihat nama file di masa depan juga, Anda dapat menggunakan headperintah:

$ head *file*
==> file_1 <==
file 1 content

==> file_2 <==
file 2 content

==> file_3 <==
file 3 content

headdefault ke 10 baris pertama, jadi menggunakannya tanpa opsi perintah untuk kasus Anda (satu kalimat per file) baik-baik saja. Jika tidak, Anda memerlukan -n Xopsi.

hjk
sumber
2

Cara lain - gunakan grep -huntuk hanya mencari string kosong di setiap file. Ini akan cocok dengan semua baris, terlepas dari berapa banyak atau tidaknya baris baru atau tidak. hasil grep selalu diakhiri baris baru. The -hpilihan Menekan awalan setiap baris output dengan nama file itu berasal dari:

$ printf 'a' > a
$ printf 'b\nB' > b
$ printf 'c\n' > c
$ ls
a  b  c
$ cat -- *
ab
Bc
$ grep -h '' *
a
b
B
c
$ 

Atau Anda bisa menggunakan GNU pastedalam -smode erial dengan baris baru sebagai pembatas:

$ paste -s -d '\n' -- *
a
b
B
c
$ 
Trauma Digital
sumber