Bagaimana cara saya memotong semua karakter setelah tanda '/' terakhir?
Teks ini
xxxx/x/xx/xx/xxxx/x/yyyyy
xxx/xxxx/xxxxx/yyy
harus kembali
xxxx/x/xx/xx/xxxx/x
xxx/xxxx/xxxxx
command-line
text-processing
Josef Klimuk
sumber
sumber
basename
dandirname
lakukan ini sudah./
" menjadi "Bagaimana cara saya memotong semua karakter setelah '/' terakhir?" yang merupakan perubahan frase yang secara wajar menyimpan artinya, IMO. Jika ada, saya merasakan bagian "hilangkan apa itu ..." ambigu: contoh - contohnya sepertinya menyimpan apa yang ada sebelum/
. Contohnya, jelaskan.Jawaban:
Jika Anda ingin mendapatkan "potongan"
Kamu bisa menggunakan
misalnya.
keluaran
(Catatan: Ini menggunakan kemampuan sed untuk menggunakan pemisah selain /, dalam hal ini |, dalam perintah s)
Jika Anda ingin memulai string:
Kamu bisa menggunakan
misalnya.
keluaran
sumber
#
bukan/
. Anda juga dapat menggunakan pilihan-r
jika Anda tidak ingin melarikan diri `\` masing-masing karakter khusus:sed -r 's#(^.*)/.*$#\1#'
.Jika Anda memotong off ujung senar,
dirname
mungkin sesuai dengan tagihan:Jika Anda mencoba mengisolasi bagian terakhir dari string, gunakan
echo /$(basename "$str")
.sumber
dirname
danbasename
tidak banyak diketahui, tetapised
danawk
yang.cat text | basename
tidak akan berfungsi. Jadi solusi yang tepat untuk pertanyaan OP menggunakandirname
danbasename
akan melibatkanxargs
dllEkspansi parameter dalam
bash
Anda dapat menggunakan ekspansi parameter dalam
bash
, dalam hal ini${parameter%word}
di manaword
adalah/*
${parameter##word}
di manaword
adalah*/
Contoh:
Hapus bagian terakhir
Ini dijelaskan dalam
man bash
:Hapus semua kecuali bagian terakhir
Anda dapat menambahkan garis miring seperti itu
untuk mendapatkan apa yang Anda inginkan pada satu contoh tertentu sesuai dengan pertanyaan yang diedit. Tetapi pertanyaannya telah diedit oleh beberapa orang setelah itu dan tidak mudah untuk mengetahui apa yang Anda inginkan sekarang.
Ini dijelaskan dalam
man bash
:sumber
Cara lain adalah menggunakan
grep
hanya menampilkan garis miring terakhir per baris dan apa pun yang mengikutinya:Penjelasan:
-o
memberitahugrep
untuk hanya menunjukkan bagian yang cocok dari garis, bukan seluruh baris.Pola tersebut
/[^/]*$
cocok dengan garis miring literal/
diikuti oleh karakter apa pun kecuali garis miring[^/]
berapa kali*
hingga akhir baris$
.sumber
Hanya karena orang lain mengirim lebih banyak jawaban "waras", berikut ini jawaban yang agak konyol:
rev
membalikkan karakter di setiap baris, misalnyaabcd/ef/g
menjadig/fe/dcba
. Kemudiancut
hentikan segmen pertama. Akhirnya dibalik lagi.sumber
Solusi klasik dengan
awk
, yang memperlakukan/
sebagai pemisah bidang untuk input dan output dan menetapkan bidang terakhir ke string kosong (yang benar-benar "dereferencing" dari jumlahNF
variabel bidang ):Lebih pendek, seperti yang ditunjukkan fedorqui dalam komentar:
Variasi pada hal itu adalah menempatkan path ke dalam
awk
lingkungan eksekusi, yang akan menghemat pada saluran air tetapi membuatawk
bagian lebih bertele-tele:sumber
NF--
? Dengan cara ini Anda menggunakanprint
bla bla.Menambah jawaban egmont karena pertanyaannya telah diedit ...
Gunakan --complement jika Anda ingin menghapus bidang pertama dengan -f1 .
Juga, pertanyaannya tidak begitu jelas tentang apa yang harus terjadi dengan input yang tidak mengandung garis miring. xxxx => xxxx atau xxxx => tidak ada
sumber
--complement
opsi sebelumnya dan halaman manualnya melingkar. Pelengkap berarti pelengkap. Saya menemukan tutorial memotong yang bagus yang membahasnya di yourownlinux.com/2015/05/... Ini seperti-v
digrep
. Beri aku segalanya kecuali apa yang cocok.-f2-
adalah bentuk yang lebih sederhana untuk-f1 --complement
.