Saya ingin menggabungkan hasil ls -1
menjadi satu baris dan membatasi dengan apa pun yang saya inginkan.
Apakah ada perintah Linux standar yang dapat saya gunakan untuk mencapai ini?
Mirip dengan opsi pertama tetapi menghilangkan pembatas trailing
ls -1 | paste -sd "," -
ls -1 | paste -s -d ":" -
Tidak yakin apakah itu universal dengan semua versi tempelpaste
mendapat-
(input standar) sebagai default, setidaknya di mypaste (GNU coreutils) 8.22
."\0"
, jadipaste -sd "\0" -
berfungsi untuk saya!Ah, kekuatan dan kesederhanaan!
Ubah koma " , " menjadi apa pun yang Anda inginkan. Perhatikan bahwa ini termasuk "trailing koma"
sumber
\n
di dalamnya, ini akan menggantikannya juga.ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
bisa menjadi sedikit lebih efisien dengan karakter penanda akhir:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
aftertr
tampaknya hanya untuk menghapus simbol terakhir tampaknya tidak masuk akal. Saya pergi denganls -1 | tr '\n' ',' | head -c -1
Ini menggantikan koma terakhir dengan baris baru:
ls -m
termasuk baris baru pada karakter lebar layar (misalnya ke-80).Sebagian besar Bash (hanya
ls
eksternal):Menggunakan
readarray
(aliasmapfile
) di Bash 4:Terima kasih kepada gniourf_gniourf untuk sarannya.
sumber
mapfile
(Bash ≥4) sebagai:mapfile -t files < <(ls -1)
. Tidak perlu mengutak-atikIFS
. Dan juga lebih pendek.IFS
untuk bergabung dengan bidang:saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Atau gunakan metode lain jika Anda ingin pemisah dengan lebih dari satu karakter.Saya pikir ini luar biasa
ORS adalah "pemisah rekaman keluaran" jadi sekarang baris Anda akan digabungkan dengan koma.
sumber
" OR "
)Kombinasi pengaturan
IFS
dan penggunaan"$*"
dapat melakukan apa yang Anda inginkan. Saya menggunakan subkulit jadi saya tidak mengganggu $ IFS shell iniUntuk menangkap output,
sumber
set
kerjanya? Terlihat seperti voodoo bagiku. dangkal melihat melaluiman set
tidak memberi saya banyak informasi baik.set
banyak argumen tetapi tidak ada opsi, ia menetapkan parameter posisi ($ 1, $ 2, ...).--
ada untuk melindungiset
jika argumen pertama (atau nama file dalam kasus ini) terjadi mulai dengan tanda hubung. Lihat deskripsi--
opsi dihelp set
. Saya menemukan parameter posisi cara mudah untuk menangani daftar hal. Saya juga bisa menerapkan ini dengan sebuah array:output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
akan memberitahu Andaset is a shell builtin
,. Jadi,man set
tidak akan membantu, tetapihelp set
akan dilakukan. Jawab: "- Tetapkan argumen yang tersisa ke parameter posisi."set -- *
. Menunda perluasan*
satu tingkat Anda mungkin mendapatkan output yang benar tanpa perlu sub shell:IFS=',' eval echo '"$*"'
. Tentu saja itu akan mengubah parameter posisi.Parsing
ls
secara umum tidak disarankan , jadi cara alternatif yang lebih baik adalah menggunakanfind
, misalnya:Atau dengan menggunakan
find
danpaste
:Untuk penggabungan umum beberapa baris (tidak terkait dengan sistem file), periksa: Ringkas dan portabel "gabung" pada baris perintah Unix .
sumber
Jangan menemukan kembali roda.
Itu persis seperti itu.
sumber
ls -m
dantr
untuk menghapus spasi setelah koma yang akan Anda lakukanls -m | tr -d ' '
sed 's/, /,/g
hanya bash
sumber
|
mengejar jejak, @camh.bash
dan gnuprintf
printf -v
hanya akan bekerja di bash, sedangkan jawaban yang disajikan bekerja pada banyak jenis shell.|
, asalkan kedua saluran yang digunakan:printf -v mystring "%s|" * ; echo ${mystring%|}
.Perintah ini untuk penggemar PERL:
Di sini 40 adalah kode ascii oktal untuk ruang.
-p akan memproses baris demi baris dan mencetak
-l akan mengurus penggantian trailing \ n dengan karakter ascii yang kami sediakan.
-e adalah untuk memberi tahu PERL bahwa kita sedang melakukan eksekusi baris perintah.
0 berarti sebenarnya tidak ada perintah untuk dieksekusi.
perl -e0 sama dengan perl -e ''
sumber
Untuk menghindari kemungkinan kebingungan baris baru untuk tr kita bisa menambahkan flag -b ke ls:
sumber
Sepertinya jawabannya sudah ada.
Jika Anda ingin
a, b, c
memformat, gunakanls -m
( jawaban Tulains Córdova )Atau jika Anda ingin
a b c
memformat, gunakanls | xargs
(versi sederhana jawaban Chris J )Atau jika Anda ingin pembatas lain seperti
|
, gunakanls | paste -sd'|'
(aplikasi jawaban Artem )sumber
Menambahkan di atas jawaban majkinetor, berikut adalah cara menghilangkan pembatas trailing (karena saya belum bisa mengomentari jawabannya):
Hapus saja trailing byte yang dihitung oleh pembatas Anda.
Saya suka pendekatan ini karena saya bisa menggunakan pembatas multi-karakter + manfaat lain dari
awk
:EDIT
Seperti yang Peter perhatikan, jumlah byte negatif tidak didukung dalam versi kepala MacOS asli. Namun ini dapat dengan mudah diperbaiki.
Pertama, instal
coreutils
. "Utilitas Inti GNU adalah utilitas manipulasi file, shell dan teks dasar sistem operasi GNU."Perintah yang disediakan oleh MacOS juga diinstal dengan awalan "g". Sebagai contoh
gls
.Setelah Anda melakukan ini, Anda dapat menggunakan
ghead
yang memiliki jumlah byte negatif, atau lebih baik, buat alias:sumber
Cara sed,
Catatan :
Ini linear dalam kompleksitas, menggantikan hanya sekali setelah semua baris ditambahkan ke Pola Space.
@ AnandRajaseka menjawab , dan beberapa jawaban serupa lainnya, seperti di sini , adalah O (n²), karena sed harus melakukan penggantian setiap kali baris baru ditambahkan ke Pola Space.
Untuk membandingkan,
sumber
Jika versi xargs Anda mendukung flag -d maka ini akan berfungsi
-d adalah bendera pembatas
Jika Anda tidak memiliki -d, maka Anda dapat mencoba yang berikut ini
Xargs pertama memungkinkan Anda untuk menentukan pembatas yang merupakan koma dalam contoh ini.
sumber
-d
menentukan pembatas input dengan GNU xargs, jadi tidak akan berfungsi. Contoh kedua menunjukkan masalah yang sama dengan solusi lain di sini dari pembatas tersasar pada akhirnya.Penjelasan:
-e
- menunjukkan perintah yang akan dieksekusi:a
- adalah label/$/N
- mendefinisikan ruang lingkup kecocokan untuk arus dan (ext) gariss/\n/\\n/;
- menggantikan semua EOL dengan\n
ta;
- label goto a jika pertandingan berhasilDiambil dari blog saya .
sumber
Kamu bisa menggunakan:
sumber
ls
menghasilkan satu output kolom ketika terhubung ke pipa, sehingga-1
redundan.Inilah jawaban perl lainnya menggunakan
join
fungsi builtin yang tidak meninggalkan pembatas trailing:Yang tidak jelas
-0777
membuat perl membaca semua input sebelum menjalankan program.sed alternatif yang tidak meninggalkan pembatas trailing
sumber
ls
memiliki opsi-m
untuk membatasi output dengan", "
koma dan spasi.perpipaan hasil ini
tr
untuk menghilangkan spasi atau koma akan memungkinkan Anda untuk menyalurkan hasilnya lagitr
untuk mengganti pembatas.dalam contoh saya, saya mengganti pembatas
,
dengan pembatas;
ganti
;
dengan pembatas satu karakter apa pun yang Anda sukai karena tr hanya menghitung karakter pertama dalam string yang Anda berikan sebagai argumen.sumber
Anda dapat menggunakan chomp untuk menggabungkan beberapa baris dalam satu baris:
perl -e 'while (<>) {if (/ \ $ /) {chomp; } print;} 'bad0> test
menempatkan kondisi garis istirahat di if pernyataan. Ini dapat berupa karakter khusus atau pembatas apa pun.
sumber
Versi Perl cepat dengan penanganan garis miring:
Untuk menjelaskan:
sumber