Bài viết này sẽ chỉ cho bạn cách tách một chuỗi tại một delimiter cho trước trong script Bash/Shell và đưa ra một số ví dụ.
Tách chuỗi là một hàm tiện lợi khi viết script. CSV (Comma Separated Values) là định dạng phổ biến cung cấp dữ liệu trực tuyến, nơi các trường dữ liệu trong bảng được tách bằng (ngạc nhiên) dấu phẩy.
Bạn cũng có thể chỉ muốn tách câu thành từ tại khoảng trắng, hoặc tách đoạn văn thành câu tại dấu chấm, v.v.
Nhiều giải pháp tập trung vào phương pháp Bash-specific để tách chuỗi. Dưới đây, tôi sẽ phác thảo một phương pháp hoạt động trong bất kỳ script shell Linux nào.
Sử dụng lệnh cut để tách chuỗi
Lệnh cut trong Linux loại bỏ các phần từ các dòng trong file văn bản và xuất ra chúng.
Ví dụ này sẽ thích nghi lệnh này để tách văn bản tại một delimiter cho trước.
Để xem manual đầy đủ của lệnh cut, bấm vào đây.
Code
Dưới đây là ví dụ script Bash lấy chuỗi splitMe và trả về các mục dựa trên vị trí của chúng trong chuỗi tách ở dấu phẩy (,):
#!/bin/bash # Định nghĩa chuỗi phân cách bằng dấu phẩy splitMe='apple,banana,grape,kiwi' # Lấy mục đầu tiên trong chuỗi tách firstItem="$(echo $splitMe | cut -d',' -f1)" # Lấy mục thứ ba trong chuỗi tách thirdItem="$(echo $splitMe | cut -d',' -f3)" # Xác nhận kết quả bằng cách xuất ra màn hình echo $thirdItem
Tại sao điều này hoạt động? Lệnh echo được dùng để pipe chuỗi gốc đến lệnh cut. Lệnh cut dùng tùy chọn -d để chỉ định delimiter (trong trường hợp này là dấu phẩy, nhưng bất kỳ ký tự hoặc chuỗi nào cũng có thể dùng), và tùy chọn -f theo sau một số để chỉ định trường nào nên được trả về – đó là vị trí của mục bạn muốn lấy từ chuỗi đã tách.
Hàm Bash tái sử dụng
Điều đó tốt, nhưng không thực sự tái sử dụng được – nên đây là dưới dạng hàm:
#!/bin/bash
# Định nghĩa hàm tách chuỗi
# Nó nhận ba tham số: chuỗi cần tách, delimiter, và cuối cùng là vị trí mục cần trả về
splitMyString(){
splitString=$1
delimiter=$2
item=$3
result="$(echo $splitString | cut -d',' -f$item)"
echo $result
}
# Định nghĩa chuỗi để test
splitMe='apple,banana,grape,kiwi'
# Test hàm bằng cách tách chuỗi ở dấu phẩy và trả về mục thứ hai
echo $(splitMyString $splitMe "," 2)