Untuk mengekstrak joebloggs
dari string ini di bash menggunakan perluasan parameter tanpa proses tambahan ...
MYVAR="/var/cpanel/users/joebloggs:DNS9=domain.com"
NAME=${MYVAR%:*} # retain the part before the colon
NAME=${NAME##*/} # retain the part after the last slash
echo $NAME
Tidak bergantung pada joebloggs
kedalaman tertentu di jalan.
Ringkasan
Ikhtisar dari beberapa mode ekspansi parameter, untuk referensi ...
${MYVAR#pattern} # delete shortest match of pattern from the beginning
${MYVAR##pattern} # delete longest match of pattern from the beginning
${MYVAR%pattern} # delete shortest match of pattern from the end
${MYVAR%%pattern} # delete longest match of pattern from the end
Jadi #
berarti cocok dari awal (pikirkan baris komentar) dan %
berarti dari akhir. Satu contoh berarti terpendek dan dua contoh berarti terpanjang.
Anda bisa mendapatkan substring berdasarkan posisi menggunakan angka:
${MYVAR:3} # Remove the first three chars (leaving 4..end)
${MYVAR::3} # Return the first three characters
${MYVAR:3:5} # The next five characters after removing the first 3 (chars 4-9)
Anda juga dapat mengganti string atau pola tertentu menggunakan:
${MYVAR/search/replace}
Ada pattern
dalam format yang sama dengan pencocokan nama file, jadi *
(karakter apa pun) adalah umum, sering kali diikuti dengan simbol tertentu seperti /
atau.
Contoh:
Diberikan variabel seperti
MYVAR="users/joebloggs/domain.com"
Hapus jalur meninggalkan nama file (semua karakter hingga garis miring):
echo ${MYVAR##*/}
domain.com
Hapus nama file, tinggalkan jalur (hapus kecocokan terpendek setelah yang terakhir /
):
echo ${MYVAR%/*}
users/joebloggs
Dapatkan hanya ekstensi file (hapus semua sebelum periode terakhir):
echo ${MYVAR##*.}
com
CATATAN: Untuk melakukan dua operasi, Anda tidak dapat menggabungkannya, tetapi harus menetapkan ke variabel perantara. Jadi untuk mendapatkan nama file tanpa jalur atau ekstensi:
NAME=${MYVAR##*/} # remove part before last slash
echo ${NAME%.*} # from the new var remove the part after the last period
domain
#
bukan%
. Jika Anda hanya menginginkan bagian setelah titik dua terakhir, gunakan${MYVAR##*:}
untuk mendapatkan bagian setelah titik dua pertama, gunakan${MYVAR#*:}
${RET##*$CHOP}
atau seperti ini${RET##*CHOP}
(atau dengan cara lain)? EDIT: Tampaknya menjadi yang pertama,${RET##*$CHOP}
Tentukan fungsi seperti ini:
Dan berikan string sebagai parameter:
sumber
echo $1 | cut -d -f 1 | xargs
. 1 untuk jawaban sederhana dan rapi.Bagaimana dengan sed? Itu akan bekerja dalam satu perintah:
#
sedang digunakan untuk pembagi regex bukan/
karena string memiliki/
di dalamnya..*/
meraih tali ke garis miring terbalik terakhir.\( .. \)
menandai grup tangkap. Ini adalah\([^:]*\)
.[^:]
mengatakan setiap karakter _except titik dua, dan*
berarti nol atau lebih..*
berarti sisa baris.\1
berarti menggantikan apa yang ditemukan di kelompok penangkapan pertama (dan satu-satunya). Ini namanya.Berikut rincian yang cocok dengan string dengan ekspresi reguler:
sumber
Menggunakan satu sed
sumber
Menggunakan satu Awk:
Artinya, baik menggunakan sebagai pemisah bidang
/
atau:
, nama pengguna selalu ada di bidang 5.Untuk menyimpannya dalam variabel:
Penerapan yang lebih fleksibel dengan
sed
itu tidak memerlukan nama pengguna menjadi bidang 5:Artinya, hapus semuanya dari
:
dan seterusnya, lalu hapus semuanya hingga yang terakhir/
.sed
mungkin lebih cepat jugaawk
, jadi alternatif ini pasti lebih baik.sumber