Saya memiliki string input seperti:
arg1.arg2.arg3.arg4.arg5
Output yang saya inginkan adalah:
arg5.arg4.arg3.arg2.arg1
Tidak selalu 5 arg, bisa 2 hingga 10.
Bagaimana saya bisa melakukan ini dalam skrip bash?
shell
text-processing
Jens
sumber
sumber
Jika Anda tidak keberatan sedikit
python
:Contoh:
s.split(".")
membuat daftar yang berisi.
substring yang terpisah,[::-1]
membalik daftar dan".".join()
bergabung dengan komponen dari daftar terbalik.
.sumber
Anda dapat melakukannya dengan satu
sed
permintaan:ini menggunakan buffer penahan untuk mendapatkan baris baru di ruang pola dan menggunakannya untuk melakukan permutasi sampai baris baru tidak lagi diikuti oleh titik mana titik itu menghapus titik terkemuka dari ruang pola dan menggantikan baris baru dengan titik.
Dengan BRE dan regex yang sedikit berbeda:
Jika input terdiri dari lebih dari satu baris dan Anda ingin membalik urutan pada setiap baris:
sumber
Solusi SED:
sumber
Dengan
zsh
:Untuk mempertahankan elemen kosong:
s:.:
: terbelah.
Oa
: sort array secara terbalik sebuah indray rray o rderj:.:
: bergabunglah.
.@
: lakukan"$@"
ekspansi-like ketika dalam tanda kutip ganda sehingga ekspansi tidak mengalami penghapusan-kosong.bash
Setara POSIX (atau ) dapat berupa sesuatu seperti:(perhatikan bahwa
zsh
(dalamsh
emulasi),yash
dan beberapapdksh
cangkang berbasis bukan POSIX dalam hal ini karena mereka memperlakukan$IFS
sebagai pemisah medan alih-alih pembatas lapangan)Di mana ia berbeda dari beberapa solusi lain yang diberikan di sini adalah bahwa ia tidak memperlakukan karakter baris baru (dan dalam kasus
zsh
, yang NUL baik) khususnya, yang$'ab.cd\nef.gh'
akan dibalik ke$'gh.cd\nef.ab'
, bukan$'cd.ab\ngh.ef'
atau$'gh.ef.cd.ab'
.sumber
IFS="."; set -f; set -- $string$IFS; for i; do rev="$i$IFS$rev"; done; printf '%s\n' "${rev%$IFS}"
?for i; do
yang bukan POSIX (belum) bahkan jika itu didukung oleh semua kerang POSIX yang saya tahu). Hanya saja solusi itu adalah terjemahan langsung dari solusi tersebutzsh
(dipecah menjadi array, array terbalik, bergabung dengan elemen array) tetapi menggunakan operator POSIX-only. (Saya telah mengubahstring=$string$IFS; set -- $string
keset -- $string$IFS
yang tampaknya bekerja secara konsisten di shell, terima kasih).Saya melihat Rahul sudah memposting solusi bash asli (antara lain), yang merupakan versi lebih pendek dari yang pertama saya buat:
tapi saya tidak bisa berhenti di situ, dan merasa perlu untuk menulis solusi bash-centric rekursif:
sumber
Tidak melihat
awk
jawaban, jadi ini satu:sumber
Pure Bash, membutuhkan periode tambahan pada input:
Gunakan
printf %s "$g"
jika salah satu elemen bertitik bisa mulai dengan tanda hubung.sumber