Làm cách nào để sử dụng sed trên Linux để lấy các giá trị từ tên tệp?


1

Làm cách nào tôi có thể truy xuất từng phần riêng biệt từ tên tệp sau đây?

DSA4020_frontcover_20346501_2011-05.doc

Tôi muốn lấy thông tin như sau:

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

Có thể làm điều này với sed?


Tại sao nên sử dụng sed khi bạn có thể sử dụng cut (hoặc awk)?
Isaac Clarke

không quan trọng là cắt hay awk. Tôi chỉ cần những giá trị đó. hãy giúp tôi ra. cảm ơn!
Hy Mã Lạp Sơn

Xem bài đăng của bạn trong stackoverflow.com
Hoàng tử John Wesley

làm xong!! cảm ơn bạn. :) và cảm ơn @eduffy nữa
Himalay

Câu trả lời:


1

Làm thế nào về sedcông thức '' này.

tiếng vang "DSA4020_frontcover_20346501_2011-05.doc" \
 | sed | s (\ ^ []] 1, loại = \ 2, id = \ 3, ngày = \ 4 | '

cung cấp mẫu CSV đẹp này,

tên = DSA4020, loại = mặt trước, id = 20346501, ngày = 2011-05

0

Bạn có thể sử dụng các mục sau để phân tách tại mỗi _ sau khi xóa tiện ích mở rộng:

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

Thay chữ số cuối cùng bằng 2, 3, 4 để lấy giá trị riêng lẻ mỗi lần.


0

Nếu số lượng trường không đổi:

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

Sau đó truy cập $ {VARS [i]} ...

Thay thế :

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

Và nếu được hỗ trợ (bash 3+)

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

Nếu bạn có nhiều tên tệp, chỉ cần thêm một forvòng lặp để lướt qua tất cả chúng.


Đó chỉ là bốn lĩnh vực.
Daniel Beck

Thói quen kiểm tra của tôi dài năm lĩnh vực: PI hy vọng OP đủ thông minh để hiểu và sửa nếu cần.
Isaac Clarke

Tôi chỉ nhận thấy, điều này cũng không loại bỏ phần mở rộng tập tin, phải không?
Daniel Beck

0

Tách tên tệp và lưu trữ trong các tham số vị trí:

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

Không cắt phần mở rộng tập tin.
Daniel Beck

@Daniel, phần này sẽ xóa phần mở rộng ".doc":${filename%.doc}
glenn jackman

Xin lỗi về điều đó, đã không nhận thấy nó.
Daniel Beck

0

Thử đi:

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

đầu ra sẽ như thế này:

name = DSA4020
type = frontcover
id = 20346501
date = 2011-05
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.