Phân Tách Chuỗi trong Bash
Trong chủ đề này, chúng ta sẽ tìm hiểu cách phân tách một chuỗi trong bash shell scripting.
Trong một số trường hợp, chúng ta có thể cần phân tách dữ liệu chuỗi để thực hiện một số tác vụ cụ thể. Hầu hết các ngôn ngữ lập trình đều chứa các hàm tích hợp ‘split’ để chia bất kỳ dữ liệu chuỗi thành nhiều phần. Tuy nhiên, bash không chứa loại hàm tích hợp này. Nhưng chúng ta có thể sử dụng các ký tự phân tách để phân tách bất kỳ dữ liệu chuỗi nào trong bash scripting. Ký tự phân tách có thể là một ký tự đơn hoặc một chuỗi với nhiều ký tự.
Xem các phương pháp dưới đây để hiểu cách phân tách chuỗi trong bash shell:
Phân tách bằng biến $IFS
Sau đây là các bước để phân tách một chuỗi trong bash bằng $ IFS:
$IFS là một biến nội bộ đặc biệt được sử dụng để chia một chuỗi thành các từ. Biến $IFS được gọi là ‘Internal Field Separator’ (Phân tách trường nội bộ) và xác định cách Bash nhận biết các ranh giới. $IFS được sử dụng để gán các ký tự phân tách cụ thể [IFS = ”] để chia chuỗi. Dấu trắng là giá trị mặc định của $IFS. Tuy nhiên, chúng ta cũng có thể sử dụng các giá trị như ‘\ t’, ‘\ n’, ‘-‘ vv làm ký tự phân tách.
Sau khi gán ký tự phân tách, chuỗi có thể được đọc bằng hai tùy chọn: ‘-r’ và ‘-a’. tức là, read -ra ARR <<< “$str”.
Ở đây, tùy chọn ‘-r’ được sử dụng để xác định rằng dấu gạch chéo () là một ký tự chứ không phải là ký tự thoát. Tùy chọn ‘-a’ được sử dụng để xác định các từ (được phân tách bởi $ IFS) được gán cho các chỉ số liên tiếp của mảng bắt đầu từ số không.
Sau đó, chúng ta áp dụng vòng lặp ‘for’ của bash để truy cập các thông số đã phân tách thành một mảng.
Hãy hiểu cơ chế này với sự giúp đỡ của một số ví dụ:
Ví dụ 1: Tách chuỗi bằng khoảng trắng
Trong ví dụ này, một chuỗi được tách bằng dấu phân cách khoảng trắng.
#!/bin/bash
#Example for bash split string by space
read -p "Enter any string separated by space: " str #reading string value
IFS='' #setting space as delimiter
read -ra ADDR <<<"$str" #reading str as an array as tokens separated by IFS
for i in "${ADDR[@]}"; #accessing each element of array
do
echo "$i"
done
Nếu chúng ta nhập một chuỗi “We welcome you on Javatpoint”, đầu ra sẽ trông như sau:
Ví dụ 2: Chia chuỗi trong Bash bằng ký hiệu.
Trong một số trường hợp, chúng ta có thể cần phải chia một chuỗi bằng các ký tự phân cách khác như một ký hiệu hoặc ký tự cụ thể. Trong ví dụ này, một chuỗi được chia bằng ký hiệu dấu phẩy (,) như là ký tự phân cách.
#!/bin/bash
#Example for bash split string by Symbol (comma)
read -p "Enter Name, State and Age separated by a comma: " entry #reading string value
IFS=',' #setting comma as delimiter
read -a strarr <<<"$entry" #reading str as an array as tokens separated by IFS
echo "Name : ${strarr[0]} "
echo "State : ${strarr[1]} "
echo "Age : ${strarr[2]}"
Kết quả
Chia chuỗi trong Bash
Trong chủ đề này, chúng ta sẽ tìm hiểu cách chia một chuỗi trong shell scripting của Bash.
Trong một số trường hợp, chúng ta có thể cần phải chia dữ liệu chuỗi để thực hiện một số công việc cụ thể. Hầu hết các ngôn ngữ lập trình đều chứa hàm tích hợp ‘split’ để chia bất kỳ dữ liệu chuỗi nào thành nhiều phần. Tuy nhiên, bash không chứa loại hàm tích hợp này. Nhưng chúng ta có thể sử dụng các ký tự phân tách để chia bất kỳ dữ liệu chuỗi nào trong shell scripting của bash. Ký tự phân tách có thể là một ký tự đơn hoặc một chuỗi có nhiều ký tự.
Hãy xem các phương pháp dưới đây để hiểu cách chia chuỗi trong shell của Bash:
Chia bằng biến $IFS
Sau đây là các bước để chia một chuỗi trong bash bằng $ IFS:
$IFS là một biến nội bộ đặc biệt được sử dụng để chia một chuỗi thành các từ. Biến $ IFS được gọi là ‘Internal Field Separator’ (Phân tách Trường Nội bộ) xác định cách Bash nhận ra các ranh giới. $ IFS được sử dụng để gán dấu phân cách cụ thể [IFS = ”] để chia nhỏ chuỗi. Khoảng trắng là giá trị mặc định của $ IFS. Tuy nhiên, chúng ta cũng có thể sử dụng các giá trị như ‘\t’, ‘\n’, ‘-‘ vv. làm dấu phân cách.
Sau khi gán dấu phân cách, một chuỗi có thể được đọc bằng hai tùy chọn: ‘-r’ và ‘-a’. ví dụ, read -ra ARR <<< “$str”.
Ở đây, tùy chọn ‘-r’ được sử dụng để xác định rằng dấu gạch chéo () là một ký tự chứ không phải là ký tự thoát. Tùy chọn ‘-a’ được sử dụng để xác định rằng các từ (được phân tách bởi $ IFS) được gán cho chỉ số tuần tự của mảng bắt đầu từ không.
Sau đó, chúng ta áp dụng vòng lặp ‘for’ của bash để truy cập các mã thông báo đã được chia thành một mảng.
Hãy hiểu cơ chế này với sự trợ giúp của một số ví dụ:
Ví dụ 1: Cắt chuỗi bằng ký tự
Ví dụ này giải thích cách một chuỗi có thể được cắt mà không sử dụng biến $IFS. Theo script, một giá trị văn bản phải được nhập vào với dấu hai chấm (:) để nó có thể được cắt. Xem script bash dưới đây:
#!/bin/bash
#Example for bash split string without $IFS
read -p "Enter any string separated by colon(:) " str #reading string value
readarray -d : -t strarr <<<"$str" #split a string based on the delimiter ':'
printf "\n"
#Print each value of Array with the help of loop
for (( n=0; n < ${#strarr[*]}; n++ ))
do
echo "${strarr[n]}"
done
Kết quả
Ví dụ 2: Tách chuỗi trong Bash bằng một chuỗi khác
Trong ví dụ này, chúng ta sử dụng các biểu thức đặc trưng mà mở rộng tham số đã được hoàn thành.
#!/bin/bash
#Example for bash split string by another string
str="WeLearnWelcomeLearnYouLearnOnLearnJavatpoint"
delimiter=Learn
s=$str$delimiter
array=();
while [[ $s ]];
do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array
Trong kịch bản bash này, chúng ta đã sử dụng các Parameter-Expansion sau:
- ${parameter%%word}: Nó loại bỏ mẫu hậu tố khớp dài nhất.
- ${parameter#word}: Nó loại bỏ mẫu tiền tố khớp ngắn nhất.
Kết quả
Ví dụ 3: Phân tách chuỗi trong Bash bằng lệnh Trim
Trong ví dụ này, chúng ta sử dụng lệnh trim (tr) để phân tách chuỗi. Thay vì sử dụng lệnh read, lệnh trim được sử dụng để phân tách chuỗi trên một ký tự phân tách nào đó.
#!/bin/bash
#Example to split a string using trim (tr) command
my_str="We;welcome;you;on;javatpoint."
my_arr=($(echo $my_str | tr ";""\n"))
for i in "${my_arr[@]}"
do
echo $i
done
Kết quả
Kết luận
Trong chủ đề này, chúng ta đã trình bày cách chia một chuỗi trong shell scripting bằng các kịch bản khác nhau, có hoặc không có sử dụng delimiter. Chúng ta đã sử dụng các lệnh như awk
, read
, tr
, parameter expansion
và IFS
để chia một chuỗi thành các phần khác nhau. Ngoài ra, cần lưu ý rằng khi sử dụng lệnh tr
để chia một chuỗi, các phần tử trong mảng sẽ được chia theo space delimiter
. Ví dụ, các phần tử như ‘Windows OS’ sẽ được coi là hai từ khác nhau.