Di zsh (dan shell lainnya), jika saya menyertakan argumen seperti (misalnya):
{a,b,c}{d,e,f}
ekspansi brace mengubahnya menjadi:
ad ae af bd be bf cd ce cf
Untuk tujuan saya, urutan argumen itu penting, dan saya perlu kawat gigi untuk melebar dari kanan ke kiri, bukan dari kiri ke kanan. Artinya, saya ingin ekspansi menjadi:
ad bd cd ae be ce af bf cf
Apakah ada cara untuk mengontrol urutan beberapa set kawat gigi diperluas? Saya mencari sesuatu yang akan bekerja dalam situasi apa pun, tidak hanya dengan argumen ini.
zsh
brace-expansion
Michael Mrozek
sumber
sumber
{a,b,c}{d,e,f}
bermanfaatJawaban:
Anda dapat menggabungkan ekspansi parameter dengan ekspansi brace.
Jika Anda tidak ingin mendefinisikan
foo
secara terpisah (seperti yang tampaknya), Anda dapat menggunakan yang berikut:Jika Anda memiliki
rcexpandparam
opsi yang diset, maka Anda tidak perlu^
dalam salah satu contoh untuk mengaktifkan perilaku ini.(Catatan: saat pengujian, saya juga memiliki
shwordsplit
opsi yang ditetapkan. Jika Anda tidak mengaturnya, maka cobalah, misalnyaecho {a,b,c}${^=:-d e f}
. Moral dari cerita: hampir semua hal mungkin terjadizsh
, tetapi Anda harus memastikan Anda menggunakan yang benar kombinasi opsi dan sintaks.)sumber
print -- {a,b,c}${^=:-d e f}
sebagai contoh utama, sejak kapansplit+glob
dimatikan secara default dizsh
.Dalam
zsh
Anda dapat menggunakan argumen-C
jumlah kolom yang ditentukan untukprint
menyukai:...mendapatkan...
... tanpa
$IFS
pemisahan berikut:... mencetak ...
... tetapi Anda dapat melakukannya melintasi sebelum turun seperti ...
...atau...
sumber
foobad foobaz barbad barbaz
dari {foo, bar} {bad, baz} `?Anda bisa meletakkan angka di akhir setiap elemen set kedua dan kemudian mengurutkan pada karakter terakhir:
Yang lebih baik adalah menambahkan angka setelah beberapa pemisah (spasi), untuk memotong bidang, bukan karakter:
sumber
Dalam
fish
shell, Anda memiliki perilaku itu secara default, karena ekspansifish
dilakukan dari kanan ke kiri :sumber