Làm cách nào tôi có thể tạo một mảng từ dòng đầu tiên của nhiều nguồn văn bản?


8

Tôi có một loạt các đường dẫn đến các tệp mà mỗi tệp có một vài dòng văn bản. Tôi muốn tạo ra một mảng được điền với dòng đầu tiên của mỗi tệp được xử lý như vậy:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Nhiều nhất tôi chỉ nhận được một giá trị trong mảng của mình. Tôi dường như không thể có được mảng tôi đang tìm kiếm từ vòng lặp for. Tôi đã thử nhiều biến thể và có một thời gian khó khăn để tìm ra nơi tôi sẽ sai.

Câu trả lời:


11

Bạn muốn

lines+=("$line")

+=WORD là nối chuỗi (hoặc bổ sung). Một phép gán ghép +=(...) nối các giá trị vào mảng.

Bạn cũng có thể muốn trích dẫn tất cả các mở rộng biến của mình ở đây - linechắc chắn cần nó nếu dòng có thể chứa khoảng trắng, nhưng bạn cũng có thể có vấn đề ở nơi khác.


Cảm ơn, bây giờ có ý nghĩa tại sao trong một số nỗ lực của tôi, có vẻ như kết quả là sự pha trộn của hai dòng.
dimmech

4

Trong Bash bạn cũng có thể đọc các dòng thành một mảng trực tiếp. Nếu bạn chọn độ dài mảng hiện tại ${#lines[@]}làm chỉ mục chèn, bạn có thể nối thêm vào nó:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Tóm tắt đoạn trích

mapfile mapfile [-n count] [-O origin] [-t] [array]

Đọc các dòng từ đầu vào tiêu chuẩn vào biến mảng được lập chỉ mục mảng [...]. Tùy chọn, nếu được cung cấp, có các ý nghĩa sau:

  • -n: Sao chép nhiều nhất là các dòng đếm . Nếu số là 0, tất cả các dòng được sao chép.

  • -O: Bắt đầu gán cho mảng tại nguồn gốc chỉ mục . Chỉ số mặc định là 0.

  • -t: Xóa một dòng mới ở mỗi dòng đọc.

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.