Jawaban:
Anda dapat menggunakan operator string :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Ini memangkas segala sesuatu dari depan sampai ':', rakus.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
. #
- dari awal; %
- dari ujung. #
, %
- pertandingan terpendek; ##
, %%
- pertandingan terlama.
echo ${pwd##*/}
tidak bekerja.
pwd
sebagai variabel. Coba dir=$(pwd); echo ${dir##*/}
. Bekerja untukku!
Cara lain adalah membalik sebelum dan sesudah cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
Ini membuatnya sangat mudah untuk mendapatkan yang terakhir kecuali satu bidang, atau rentang bidang apa pun yang dinomori dari akhir.
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, hanya apa yang saya butuhkan! cut -b20- | rev | cut -b10- | rev
Sulit untuk mendapatkan bidang terakhir menggunakan potongan, tetapi berikut adalah beberapa solusi dalam awk dan perl
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
karakter finishing : /a/b/c/d
dan /a/b/c/d/
menghasilkan hasil yang sama ( d
) saat memproses pwd | awk -F/ '{print $NF}'
. Jawaban yang diterima menghasilkan hasil kosong dalam kasus/a/b/c/d/
/
sebagai pembatas, dan jika path Anda /my/path/dir/
itu akan menggunakan nilai setelah pembatas terakhir, yang hanya berupa string kosong. Jadi yang terbaik adalah menghindari trailing slash jika Anda perlu melakukan hal seperti yang saya lakukan.
awk '{$NF=""; print $0}' FS=: OFS=:
sering bekerja dengan cukup baik.
Dengan asumsi penggunaan yang cukup sederhana (misalnya, tidak ada pembatas pembatas), Anda dapat menggunakan grep:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
Breakdown - temukan semua karakter bukan pembatas ([^:]) di akhir baris ($). -o hanya mencetak bagian yang cocok.
Satu arah:
var1="1:2:3:4:5"
var2=${var1##*:}
Lain, menggunakan array:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
Lain lagi dengan array:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
Menggunakan Bash (versi> = 3.2) ekspresi reguler:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
Cukup terjemahkan pembatas ke baris baru dan pilih entri terakhir tail -1
.
\n
, tetapi untuk sebagian besar kasus adalah solusi yang paling mudah dibaca.
Menggunakan sed
:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
Jika bidang terakhir Anda adalah karakter tunggal, Anda bisa melakukan ini:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
Periksa manipulasi string dalam bash .
a
, bukan yang terakhir bidang .
Ada banyak jawaban bagus di sini, tetapi saya masih ingin membagikan yang ini dengan menggunakan nama kecil :
basename $(echo "a:b:c:d:e" | tr ':' '/')
Namun itu akan gagal jika sudah ada beberapa '/' di string Anda . Jika slash / adalah pembatas Anda maka Anda hanya perlu (dan harus) menggunakan basename.
Ini bukan jawaban terbaik tetapi itu hanya menunjukkan bagaimana Anda bisa kreatif menggunakan perintah bash.
Menggunakan Bash.
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
sebagai ganti eval echo \$${#}
.
for x in `echo $str | tr ";" "\n"`; do echo $x; done
Bagi mereka yang nyaman dengan Python, https://github.com/Russell91/pythonpy adalah pilihan yang bagus untuk menyelesaikan masalah ini.
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
Dari pythonpy bantuan: -x treat each row of stdin as x
.
Dengan alat itu, mudah untuk menulis kode python yang diterapkan pada input.
Mungkin agak terlambat dengan jawabannya meskipun solusi sederhana adalah membalik urutan string input. Ini akan memungkinkan Anda untuk selalu mendapatkan item terakhir tidak peduli panjangnya.
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
Penting untuk dicatat, jika menggunakan metode ini dan angkanya lebih besar dari 1 digit (Atau lebih besar dari satu karakter dalam keadaan apa pun), Anda perlu menjalankan perintah 'rev' lain di atas keluaran yang disalurkan.
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
Semoga saya bisa membantu, tepuk tangan
Jika Anda suka python dan memiliki opsi untuk menginstal paket, Anda dapat menggunakan utilitas python ini .
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
paket adalah untuk membuat Anda melakukan hal yang sama python -c
dengan mengetik karakter lebih sedikit. Silakan lihat README di repositori.
5
jika stringnya1:2:3:4:5:
(saat menggunakan operator string menghasilkan hasil kosong). Ini sangat berguna ketika parsing path yang bisa berisi (atau tidak)/
karakter finishing .