Jawaban:
Contoh mungkin berguna, tetapi jika saya mengerti Anda dengan benar, ini akan berhasil:
echo "Hello: world" | cut -f1 -d":"
Ini akan mengubah "halo: dunia" menjadi "halo".
basenamedan cut, lihat jawaban Dennis di bawah ini
cutdapat membaca dari stdin, jadi itu lebih baik terutama ketika Anda memiliki string yang sangat panjang yang perlu Anda proses, seperti isi file.
hello: world. Ini setengah jawaban.
Di Bash (dan ksh, zsh, dash, dll.), Anda dapat menggunakan ekspansi parameter %yang akan menghapus karakter dari ujung string atau #yang akan menghapus karakter dari awal string. Jika Anda menggunakan satu dari karakter itu, string pencocokan terkecil akan dihapus. Jika Anda menggandakan karakter, yang terpanjang akan dihapus.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:worldmenjadi hello:wodengan menggunakan ${a%:*}?
"${a##*:}"untuk hanya mendapatkan tomorrow=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ pattern]]; echo "$ {BASH_REMATCH [1]}" `. Itu cocok hanya jika ada titik dua. Jika Anda ingin itu opsional, pola yang berbeda harus digunakan. Penjelasan tentang regex Bash (dan regex secara umum) berada di luar cakupan komentar ini. Anda dapat menemukan pertanyaan lain yang membahas hal ini atau memposting pertanyaan Anda sendiri.
egrep -o '^[^:]*:'
egrepGrep dengan -E. Tidak ada bedanya di sini dari biasa grep. -omenginstruksikan grep untuk mencetak hanya bagian dari garis yang cocok dengan ekspresi. ^jangkar pertandingan ke awal baris. [^:]*cocok dengan nol atau lebih karakter yang bukan :karakter. :cocok dengan karakter :.
Katakanlah Anda memiliki jalur dengan file dalam format ini:
/dirA/dirB/dirC/filename.file
Sekarang Anda hanya menginginkan jalur yang mencakup empat "/". Tipe
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
dan output Anda akan menjadi
/dirA/dirB/dirC
Keuntungan menggunakan cut adalah Anda juga dapat memotong direktori uppest serta file (dalam contoh ini), jadi jika Anda mengetik
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
output Anda akan menjadi
/dirA/dirB
Meskipun Anda dapat melakukan hal yang sama dari sisi lain dari string, itu tidak masuk akal dalam hal ini sebagai mengetik
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
hasil dalam
dirA/dirB/dirC
Dalam beberapa kasus lain, kasus terakhir mungkin juga bermanfaat. Pikiran bahwa tidak ada "/" di awal output terakhir.
potong semuanya setelah contoh terakhir dari ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
dan jika Anda ingin menjatuhkan yang terakhir ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: Anda ingin menggantinya :dengan /(di mana seharusnya sed kolon \/)
cutberfungsi, tetapi jawaban saya Dennis lebih baik dan lebih fleksibel. Apakah ada yang tahu jika itu memunculkan proses barucut?