Saya ingin menggunakan substitusi variabel pada string tertentu yang saya akses melalui perintah. Misalnya, jika saya menyalin sesuatu ke clipboard saya, saya dapat mengaksesnya seperti ini.
$ xclip -o -selection clipboard
Here's a string I just copied.
Jika saya menugaskannya ke variabel, maka saya bisa melakukan substitusi variabel di dalamnya.
$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.
Namun, apakah ada cara untuk melakukan substitusi variabel tanpa menugaskannya ke variabel? Secara konseptual, sesuatu seperti ini.
$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution
Sintaks ini gagal, karena var
harus berupa nama variabel, bukan string.
bash
. (Dan mendorong saya lagi untuk bermigrasi kezsh
.)Ya, Anda bisa melakukan itu - semacam itu. Benar-benar tidak cantik. Ini lebih seperti in-line daripada bersarang. Masalahnya adalah Anda harus beroperasi pada nilai parameter yang Anda kembangkan - jika parameter itu tidak memiliki nilai maka Anda tidak akan berbuat banyak. Jadi, Anda dapat menetapkan nilai sambil mengembangkannya dan itu bukan jalan pintas.
Saya menggunakan
$0
ekspansi param dalam rantai untuk menyembunyikan tugas. Ini memberikan nilai var dalam perluasan penugasan bersarang. Bagian luar lebih diutamakan - tetapi karena ia hanya akan meluas ke bagian dalam apa pun yang dilakukan sulit untuk diceritakan. Namun, jika kami membungkam ekspansi batin, maka modifikasi itu Anda bisa mendapatkan apa yang Anda inginkan. Setelah menyalin string Anda ke clipboard saya (saya tidak punyaxclip
- hanyaxsel
) itu mencetak:Namun, sedikit lebih jelas apa yang terjadi jika Anda
$0
keluar:Itu mencetak:
... karena penugasan bagian dalam terjadi sebelum modifikasi, tetapi, seperti yang disebutkan, penugasan bagian luar diutamakan - dan meluas ke ekspansi penugasan bagian dalam maupun ke ekspansi bagian dalam yang dimodifikasi.
Tentu saja tidak ada yang bekerja sama sekali jika parameter yang ditargetkan sudah ditetapkan - jadi Anda hanya bisa melakukannya jika Anda mengosongkan variabel di tempat pertama ... yang, jujur, mungkin waktu yang paling nyaman untuk menetapkannya setelah semua .
sumber
alias
tipuan untuk membuatnya sedikit lebih nyaman - tetapi jika nilainya bagi Anda maka Anda harus mengatur fungsi untuk menangani kutipan-aman dan melakukan sesuatu denganeval
atau sesuatu seperti itu pula. w /eval
- jika Anda dapat membuat karakter pertama dari jumlah output sub perintah ke sintaks ekspansi yang bisa diterapkan - maka Anda mungkin bisa mendapatkan lebih jauh lebih mudah. Saya tahu hal seperti itu akan mudah wxsel
- - dibutuhkan stdin - tetapixsel
?Jika Anda tidak ingin membuat variabel aa, maka ada cara lain untuk melakukan penggantian string:
sumber
sed
sebagai gantinya, tetapi itu dimaksudkan untuk lebih menjadi pertanyaan umum, tentang bersarang substitusi.