Jadi jika saya punya variabel
VAR='10 20 30 40 50 60 70 80 90 100'
dan gema itu
echo "$VAR"
10 20 30 40 50 60 70 80 90 100
Namun, lebih jauh ke bawah skrip saya perlu membalik urutan variabel ini sehingga terlihat seperti sesuatu
echo "$VAR" | <code to reverse it>
100 90 80 70 60 50 40 30 20 10
Saya mencoba menggunakan rev dan secara harfiah membalikkan semuanya sehingga keluar sebagai
echo "$VAR" | rev
001 09 08 07 06 05 04 03 02 01
Jawaban:
Pada sistem GNU, kebalikan dari cat adalah tac:
sumber
echo $'100 \n90 80 70 60 50 40 30 20 10'
tac -s" " <<< "$VAR "
versi saat ini, masih menyisipkan baris kosong terkemuka, menambahkan spasi tambahan dan menghilangkan karakter baris baru tertinggal (seolah-olahprintf '\n%s ' "$reversed_VAR"
bukannya diharapkanprintf '%s\n' "$reversed_VAR"
)echo $(tac -s" " <<< $VAR)
tidak memiliki spasi tambahan karena$(…)
menghilangkan spasi tambahan baris baru dan spasi jika IFS memilikinya. Solusi saya akan segera diperbaiki, terima kasih.Untuk daftar pendek, dan dalam sebuah variabel, shell itu sendiri adalah solusi tercepat:
Keluaran:
Catatan: operasi pemisahan di
set -- $var
aman untuk string yang tepat digunakan di sini, tetapi tidak akan jadi jika string berisi karakter wildcard (*
,?
atau[]
). Ini dapat dihindari denganset -f
sebelum perpecahan, jika diperlukan. Catatan yang sama juga berlaku untuk solusi berikut (kecuali jika disebutkan).Atau, jika Anda ingin mengatur beberapa variabel lain dengan daftar terbalik:
Atau hanya menggunakan parameter posisi.
Atau hanya menggunakan satu variabel (yang mungkin var sendiri):
Catatan: Solusi ini tidak terpengaruh oleh globing atau IFS.
sumber
awk
untuk menyelamatkanwith
perl
, courtesy Bagaimana cara membaca alamat IP secara terbalik?dibagikan oleh @steeldriverAtau, dengan
bash
sendirinya dengan mengubah string menjadi arraysumber
Anda dapat menggunakan fitur bash seperti array untuk melakukannya sepenuhnya dalam proses:
Ini seharusnya tentang cara tercepat untuk melakukannya asalkan $ VAR tidak terlalu besar.
sumber
VAR='+ * ?'
). Gunakanset -o noglob
atauset -f
untuk memperbaikinya. Secara umum, itu ide yang baik untuk mempertimbangkan nilai$IFS
dan keadaan globbing ketika menggunakan operator split + glob. Tidak, tidak masuk akal untuk menggunakan operator iturev_a+=( ${a[$i]} )
,rev_a+=( "${a[$i]}" )
akan lebih masuk akal.sumber
Gunakan sedikit sihir Python di sini:
Cara kerjanya cukup sederhana:
"$VAR"
sebagai paramenter baris perintah keduasys.argv[1]
(parameter pertama dengan-c
opsi selalu hanya itu --c
itu sendiri. Perhatikan kutipan di sekitar"$VAR"
untuk mencegah pemisahan variabel itu sendiri menjadi kata-kata individual (yang hisi dilakukan oleh shell, bukan python).split()
metode, untuk memecahnya menjadi daftar string[::-1]
Bagian ini hanya memperpanjang sintaks slice untuk mendapatkan kebalikan dari daftar" ".join()
dan mencetakTetapi mereka yang bukan penggemar Python besar, bisa kita gunakan
AWK
untuk melakukan hal yang pada dasarnya sama: split, dan print array secara terbalik:sumber
python3 -c 'import sys;print(*reversed(sys.argv[1:]))' $VAR
$IFS
berisi karakter yang tepat dan tanpa menonaktifkan bagian glob."$VAR"
hasilpython3 -c 'import sys;print(*reversed(sys.argv[1].split()))' "$VAR"
zsh
:$=VAR
membagi$VAR
pada$IFS
.(Oa)
memesan daftar yang dihasilkan dalam urutan array terbalik.print -r --
(seperti dalamksh
), sama denganecho -E -
(zsh
spesifik) adalah versi yang dapat diandalkanecho
: mencetak argumennya sebagai-dipisahkan oleh ruang, diakhiri oleh baris baru.Jika Anda ingin membagi pada ruang saja, dan bukan pada apa pun yang
$IFS
berisi (spasi, tab, baris baru, nul secara default), tetapkan ruang untuk$IFS
, atau gunakan pemisahan eksplisit seperti:Untuk mengurutkan dalam urutan angka terbalik:
POSIXly (demikian juga akan bekerja dengan
bash
):Hanya dengan
printf
mekanisme builtin shell (kecuali untuk beberapa shell) (lebih baik untuk variabel dengan nilai pendek):Dengan
awk
(lebih baik untuk variabel besar, terutama denganbash
, tetapi hingga batas ukuran argumen (atau argumen tunggal)):sumber
Janggal POSIX perangkat lunak satu-liner:
sumber