Cách tách tên tệp và phần mở rộng trong Bash

Cách tách tên tệp và phần mở rộng trong Bash
Cách tách tên tệp và phần mở rộng trong Bash

Giới thiệu:

Khi làm việc với các tệp trong Bash, bạn thường có thể cần tách tên tệp khỏi phần mở rộng của nó. Một cách tiếp cận phổ biến là sử dụng lệnh `cut`, nhưng phương pháp này có thể thất bại với tên tệp chứa nhiều dấu chấm.

Ví dụ: tên tệp như `a.b.js` sẽ bị chia không chính xác thành `a` và `b.js` thay vì `a.b` và `js`. Mặc dù Python cung cấp một giải pháp dễ dàng với `os.path.splitext()`, nhưng việc sử dụng Python không phải lúc nào cũng là lựa chọn hiệu quả nhất. Bài viết này khám phá các phương pháp tốt hơn để đạt được nhiệm vụ này trong Bash.

Yêu cầu Sự miêu tả
${variable%.*} Mở rộng tham số để xóa phần mở rộng khỏi tên tệp.
${variable##*.} Mở rộng tham số để trích xuất phần mở rộng từ tên tệp.
awk -F. Đặt dấu phân cách trường thành dấu chấm, dùng để phân tách tên tệp.
OFS="." Dấu phân cách trường đầu ra trong awk, được sử dụng để xây dựng lại tên tệp mà không cần phần mở rộng.
NF-- Giảm số lượng trường xuống một trường trong awk, loại bỏ tiện ích mở rộng một cách hiệu quả.
${BASH_REMATCH} Mảng chứa các kết quả khớp từ một biểu thức chính quy trong Bash.
local variable Khai báo một biến có phạm vi cục bộ trong hàm trong Bash.

Phân tích chi tiết về các giải pháp Bash

Các tập lệnh được cung cấp cung cấp nhiều phương pháp khác nhau để phân tách tên tệp và phần mở rộng của nó trong Bash. Tập lệnh đầu tiên sử dụng mở rộng tham số Bash. Biến ${FILE%.*} xóa phần mở rộng bằng cách loại bỏ mọi thứ từ dấu chấm cuối cùng đến cuối chuỗi, trong khi ${FILE##*.} nắm bắt phần mở rộng bằng cách lấy mọi thứ sau khoảng thời gian cuối cùng. Phương pháp này đơn giản và hiệu quả đối với hầu hết các cấu trúc tên tệp. Kịch bản thứ hai sử dụng awk, một công cụ xử lý văn bản mạnh mẽ trong môi trường giống Unix. Bằng cách đặt dấu phân cách trường thành dấu chấm bằng cách sử dụng -F., nó cho phép chia tên tệp thành nhiều phần. Dấu phân cách trường đầu ra, OFS="."và giảm số lượng trường với NF-- là các kỹ thuật để tập hợp lại tên tệp mà không cần phần mở rộng của nó.

Tập lệnh thứ ba sử dụng các biểu thức chính quy trong Bash, tận dụng ${BASH_REMATCH} để nắm bắt các nhóm trong một trận đấu biểu thức chính quy. Tập lệnh này sử dụng mẫu chia tên tệp thành hai nhóm: một cho tên cơ sở và một cho phần mở rộng. Cuối cùng, tập lệnh hàm tùy chỉnh đóng gói logic mở rộng tham số trong một hàm, nâng cao khả năng sử dụng lại và dễ đọc mã. Nó sử dụng local variable các khai báo để giữ các biến nằm trong phạm vi hàm, ngăn ngừa các tác dụng phụ ngoài ý muốn trong các tập lệnh lớn hơn. Mỗi phương pháp thể hiện một cách tiếp cận khác nhau để giải quyết cùng một vấn đề, thể hiện tính linh hoạt và sức mạnh của tập lệnh Bash.

Sử dụng mở rộng tham số trong Bash

Kịch bản Bash

#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Sử dụng Awk để tách tên tệp và phần mở rộng

Bash với Awk

#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Sử dụng biểu thức chính quy trong Bash

Tập lệnh Bash với biểu thức chính quy

#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Sử dụng hàm tùy chỉnh trong Bash

Tập lệnh Bash với chức năng tùy chỉnh

#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
  local file="$1"
  echo "Filename: ${file%.*}"
  echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"

Khám phá các phương pháp thay thế để thao tác tệp trong Bash

Ngoài các phương pháp đã được thảo luận, còn có các kỹ thuật hữu ích khác trong Bash để thao tác tên tệp và phần mở rộng. Một phương pháp như vậy liên quan đến việc sử dụng số 8dirname lệnh. số 8 có thể được sử dụng để trích xuất tên tệp từ một đường dẫn, trong khi dirname lấy đường dẫn thư mục. Việc kết hợp các lệnh này với việc mở rộng tham số có thể tách biệt tên tệp và phần mở rộng một cách hiệu quả. Ví dụ, sử dụng basename "$FILE" ".${FILE##*.}" xóa phần mở rộng khỏi tên tệp. Cách tiếp cận này đặc biệt hữu ích khi làm việc với đường dẫn tệp đầy đủ thay vì chỉ tên tệp.

Một phương pháp khác liên quan đến việc sử dụng sed, trình chỉnh sửa luồng mạnh mẽ để lọc và chuyển đổi văn bản. Bằng cách tạo ra các biểu thức chính quy thích hợp, sed có thể cô lập tên tập tin và phần mở rộng. Ví dụ, lệnh echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' chia tách tên tệp và phần mở rộng, đặt chúng vào các nhóm chụp riêng biệt. Kỹ thuật này linh hoạt và có thể xử lý các cấu trúc tên tệp phức tạp. Việc khám phá các công cụ và phương pháp bổ sung này sẽ mở rộng khả năng thao tác dữ liệu tệp của bạn trong Bash, cung cấp các giải pháp mạnh mẽ cho các tình huống tập lệnh khác nhau.

Câu hỏi thường gặp về thao tác tệp Bash

  1. Mục đích của việc này là gì ${FILE%.*} yêu cầu?
  2. Nó xóa phần mở rộng khỏi tên tệp bằng cách loại bỏ mọi thứ sau khoảng thời gian cuối cùng.
  3. Làm thế nào ${FILE##*.} lệnh làm việc?
  4. Nó trích xuất phần mở rộng bằng cách lấy mọi thứ sau dấu chấm cuối cùng trong tên tệp.
  5. làm gì awk -F. làm gì trong kịch bản được cung cấp?
  6. Nó đặt dấu phân cách trường thành một dấu chấm, cho phép chia tên tệp thành nhiều phần.
  7. Tại sao sử dụng NF-- trong một awk kịch bản?
  8. Nó giảm số lượng trường đi một, loại bỏ phần mở rộng khỏi tên tệp một cách hiệu quả.
  9. Biểu thức chính quy giúp trích xuất tên tệp và phần mở rộng như thế nào?
  10. Chúng cho phép khớp và nhóm mẫu, có thể tách biệt các phần khác nhau của tên tệp.
  11. Lợi ích của việc sử dụng hàm tùy chỉnh trong Bash là gì?
  12. Chức năng tùy chỉnh nâng cao khả năng sử dụng lại và dễ đọc mã, làm cho các tập lệnh trở nên mô-đun hơn.
  13. Làm thế nào số 8 giúp đỡ về tên tập tin?
  14. Nó trích xuất tên tệp từ đường dẫn tệp đầy đủ, tùy ý xóa phần mở rộng.
  15. Có thể sed được sử dụng để thao tác tên tập tin?
  16. Đúng, sed có thể sử dụng biểu thức chính quy để chuyển đổi và tách biệt các phần của tên tệp.

Tổng hợp các giải pháp trích xuất tên tệp và phần mở rộng

Tóm lại, việc trích xuất tên tệp và phần mở rộng trong Bash có thể đạt được một cách hiệu quả thông qua nhiều phương pháp khác nhau, mỗi phương pháp phù hợp với nhu cầu và sở thích khác nhau. Cho dù sử dụng các hàm mở rộng tham số, awk, sed hay tùy chỉnh, các kỹ thuật này đều cung cấp các giải pháp linh hoạt và hiệu quả. Việc hiểu và sử dụng các lệnh này đảm bảo rằng các tập lệnh có thể xử lý tên tệp có nhiều dấu chấm và các độ phức tạp khác mà không gặp lỗi.