Bagaimana cara menggunakan sed di Linux untuk mendapatkan nilai dari nama file?


1

Bagaimana saya bisa mengambil setiap bagian secara terpisah dari nama file berikut?

DSA4020_frontcover_20346501_2011-05.doc

Saya ingin mengambil informasi seperti di bawah ini:

name = DSA4020
type = frontcover
id =  20346501
date = 2011-05

Apakah mungkin untuk melakukan ini dengan sed?


Mengapa menggunakan sed ketika Anda bisa menggunakan cut (atau awk)?
Isaac Clarke

tidak masalah apakah dipotong atau canggung. Saya hanya perlu nilai-nilai itu. tolong bantu saya. Terima kasih!
Himalay

Lihat posting Anda di stackoverflow.com
Pangeran John Wesley

selesai !! Terima kasih. :) dan terima kasih kepada @eduffy juga
Himalay

Jawaban:


1

Bagaimana dengan sedresep ini?

echo "DSA4020_frontcover_20346501_2011-05.doc" \
 | sed | \ ([^ _] * \) _ \ ([^ _] * \) _ \ ([^ _] * \) _ \ ([^ \.] * *). * | name = \ 1, ketik = \ 2, id = \ 3, date = \ 4 | '

memberikan formulir CSV yang bagus ini,

name = DSA4020, type = frontcover, id = 20346501, tanggal = 2011-05

0

Anda dapat menggunakan yang berikut ini untuk membagi di setiap _ setelah menghapus ekstensi:

$ echo "DSA4020_frontcover_20346501_2011-05.doc" | cut -d. -f-1 | cut -d_ -f1
DSA4020

Ganti digit terakhir dengan 2, 3, 4 untuk mendapatkan nilai individu setiap kali.


0

Jika jumlah bidangnya konstan:

for i in 1 2 3 4 5; do  
    VARS[${i}]=$(echo ${yourfilename} | cut -d _ -f${i})
done

Kemudian akses $ {VARS [i]} ...

Alternatif:

VARS[${i}]=$(echo ${yourfilename} | awk -v i=${i} -F_ '{print $i}'

Dan jika didukung (bash 3+)

for i in {1..5}; do (...)

Jika Anda memiliki beberapa nama file, cukup tambahkan satu forlingkaran untuk membaca sekilas semuanya.


Itu hanya empat bidang.
Daniel Beck

Rutin pengujian saya adalah lima bidang: PI berharap OP cukup pintar untuk memahami dan memperbaiki jika diperlukan.
Isaac Clarke

Saya baru saja memperhatikan, ini juga tidak menghapus ekstensi file, bukan?
Daniel Beck

0

Pisahkan nama file dan simpan dalam parameter posisi:

set -- $(sed 's/_/ /g' <<< ${filename%.doc})
name=$1
type=$2
id=$3
date=$4

Tidak memotong ekstensi file.
Daniel Beck

@Daniel, bagian ini akan menghapus ekstensi ".doc":${filename%.doc}
glenn jackman

Maaf tentang itu, tidak menyadarinya.
Daniel Beck

0

Coba ini:

echo "DSA4020_frontcover_20346501_2011-05.doc" | awk -F '_' '{print " name =" $1 "\n type =" $2 "\n id =" $3 "\n date =" $4 } '

output akan seperti ini:

name = DSA4020
type = frontcover
id = 20346501
date = 2011-05
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.