Làm thế nào để biết nếu một chuỗi Bash có chứa một

[ad_1]

Sửa máy tính tại nhà TPHCM

fatmawati achmad zaenuri / Shutterstock.com

Đôi khi trong các tập lệnh Linux, bạn muốn biết liệu một chuỗi văn bản có chứa một chuỗi cụ thể, nhỏ hơn hay không. Có rất nhiều cách để làm điều này. Chúng tôi chỉ cho bạn một số kỹ thuật đơn giản, đáng tin cậy.

Tại sao điều này lại hữu ích?

Tìm kiếm một chuỗi cho một chuỗi con nhỏ hơn là một yêu cầu phổ biến. Một ví dụ sẽ là đọc văn bản từ một tệp hoặc từ đầu vào của con người và tìm kiếm chuỗi cho một chuỗi con cụ thể để tập lệnh của bạn có thể quyết định phải làm gì tiếp theo. Nó có thể đang tìm kiếm nhãn hoặc tên thiết bị trong tệp cấu hình hoặc chuỗi lệnh trong một dòng đầu vào từ người dùng.

Người dùng Linux được may mắn với bất kỳ tiện ích nào để thao tác văn bản. Một số được tích hợp vào Bash shell, một số khác được cung cấp dưới dạng các tiện ích hoặc ứng dụng độc lập. Có một lý do tại sao các hệ điều hành dựa trên Unix được phục vụ phong phú với khả năng thao tác chuỗi.

Một số thứ dường như là tệp không phải là tệp đơn giản. Họ đang các tập tin đặc biệt đại diện cho những thứ như thiết bị phần cứng và nguồn thông tin hệ thống. Tính trừu tượng được thực hiện bởi hệ điều hành cung cấp cho chúng hình thức và đặc điểm của tệp. Bạn có thể đọc thông tin từ chúng — dưới dạng văn bản, một cách tự nhiên — và trong một số trường hợp, ghi vào chúng, nhưng chúng không phải là tệp thông thường.

Văn bản cũng được sử dụng làm đầu vào và đầu ra cho các lệnh trong cửa sổ đầu cuối. Điều này cho phép chuyển hướng và đường ống của đầu vào và đầu ra. Chức năng đó làm nền tảng cho khả năng xâu chuỗi các lệnh Linux lại với nhau, chuyển đầu ra từ một lệnh làm đầu vào cho lệnh tiếp theo.

Bất kể nguồn gốc của nó là gì, việc tìm kiếm văn bản mà chúng ta nhận được để tìm một từ, lệnh, nhãn quan trọng hoặc một số chỉ báo khác là một phần tiêu chuẩn của việc xử lý dữ liệu dựa trên văn bản. Dưới đây là một bộ sưu tập các kỹ thuật đơn giản mà bạn có thể đưa vào các tập lệnh của riêng mình.

Tìm các chuỗi con với nội trang Bash

Dấu ngoặc kép “[[...]]”Kiểm tra so sánh chuỗi có thể được sử dụng trong if các câu lệnh để xác định xem một chuỗi có chứa một chuỗi khác hay không.

Sao chép tập lệnh này vào trình chỉnh sửa và lưu vào tệp có tên “double.sh”.

#!/bin/bash

if [[ "monkey" = *"key"* ]]; then
  echo "key is in monkey"
else
  echo "key is not in monkey"
fi

Bạn sẽ cần làm cho tập lệnh có thể thực thi được với chmod yêu cầu. Đây là bước luôn bắt buộc để thực thi bất kỳ tập lệnh nào. Bạn sẽ cần thực hiện việc này mỗi khi tạo tệp tập lệnh. Thay thế tên của tập lệnh thích hợp trong mỗi trường hợp.

chmod +x double.sh

làm cho một tập lệnh có thể thực thi được với chmod

Hãy chạy script.

./double.sh

Chạy tập lệnh double.sh

Điều này hoạt động vì dấu hoa thị ” * ”Đại diện cho bất kỳ chuỗi ký tự nào, kể cả không có ký tự nào. Nếu chuỗi con “khóa” nằm trong chuỗi đích, có hoặc không có bất kỳ ký tự nào phía trước hoặc phía sau nó, thì kiểm tra sẽ trả về true.

Trong ví dụ của chúng tôi, có các ký tự phía trước chuỗi con. Chúng được khớp bởi dấu hoa thị đầu tiên. Không có ký tự nào phía sau chuỗi con nhưng vì dấu hoa thị cũng không khớp với ký tự nào nên bài kiểm tra vẫn vượt qua.

Để linh hoạt, chúng tôi có thể sửa đổi tập lệnh của mình để xử lý các biến thay vì các chuỗi theo nghĩa đen. Đây là tập lệnh “double2.sh.”

#!/bin/bash

string="Monkey"
substring="key"

if [[ $string = *$substring* ]]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Hãy xem nó chạy như thế nào.

./double2.sh

Chạy tập lệnh double2.sh

Điều này hoạt động theo cách tương tự, với ưu điểm là chúng ta có thể sử dụng tên biến thay vì chuỗi ký tự. Biến giải pháp nhỏ của chúng tôi thành một chức năng sẽ mang lại sự linh hoạt nhất.

Đây là tập lệnh “double3.sh.”

#!/bin/bash

shopt -s nocasematch

string="Monkey"
substring="Key"
capital="London"

check_substring ()
{
if [[ $1 = *$2* ]]; then
  echo "$2 was found in $1"
else
  echo "$2 was not found in $1"
fi
}

check_substring "Monkey" "key" 
check_substring $string $substring
check_substring $string "banana"
check_substring "Wales" $capital

Chúng tôi gọi của chúng tôi check_substring hàm sử dụng kết hợp các biến và chuỗi ký tự. Chúng tôi đã sử dụng shopt với nó -s (set) tùy chọn để thiết lập nocasematchđể làm cho các trận đấu không phân biệt chữ hoa chữ thường.

Đây là cách nó chạy.

./double3.sh

Chạy tập lệnh double3.sh

Chúng ta có thể sử dụng thủ thuật quấn chuỗi con trong dấu hoa thị trong case các câu lệnh cũng vậy. Đây là “case.sh.”

#!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Wall"

case $string in

  *$substring*)
    echo "$substring was found in $string"
    ;;

  *)
    echo "Nothing matched: $string"
    ;;
esac

Sử dụng case thay vì rất dài if các câu lệnh có thể làm cho các tập lệnh dễ đọc và gỡ lỗi hơn. Nếu bạn cần kiểm tra xem một chuỗi có chứa một trong nhiều chuỗi con có thể xảy ra hay không, thì case tuyên bố sẽ là sự lựa chọn tốt nhất.

./case.sh

Chạy tập lệnh case.sh

Chuỗi con được tìm thấy.

Tìm chuỗi con với grep

Ngoài các nội trang Bash, công cụ tìm kiếm văn bản đầu tiên bạn có thể tiếp cận là grep. Chúng ta có thể sử dụng grepkhả năng bẩm sinh của để tìm kiếm một chuỗi trong một chuỗi để tìm kiếm các chuỗi con của chúng ta.

Tập lệnh này được gọi là “subgrep.sh”.

#!/bin/bash

string="porridge pot"
substring="ridge"

if $(echo $string | grep -q $substring); then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Tập lệnh sử dụng echo để gửi chuỗi vào grep, tìm kiếm chuỗi con. Chúng tôi đang sử dụng -q (yên tĩnh) tùy chọn để dừng lại grep ghi bất cứ thứ gì vào đầu ra tiêu chuẩn.

Nếu kết quả của các lệnh bên trong dấu ngoặc đơn “(...)”Bằng 0, có nghĩa là một kết quả phù hợp đã được tìm thấy. Bởi vì số không tương đương với true trong Bash, if tuyên bố hài lòng và then mệnh đề được thực thi.

Hãy xem đầu ra của nó là gì.

./subgrep.sh

Chạy tập lệnh subgrep.sh

Tìm chuỗi con với sed

Chúng ta có thể sử dụng sed để tìm một chuỗi con.

By default, sed prints all text that is fed into it. Using sed -n prevents this. The only lines that are printed are matching lines. This expression will print any lines that match or contain the value of $substring.

"/$substring/p"

Chúng tôi cung cấp giá trị của $string vào trong sed sử dụng chuyển hướng tại đây, <<<. Điều này được sử dụng để chuyển hướng các giá trị thành một lệnh trong trình bao hiện tại. Nó không gọi một vỏ con theo cách mà một đường ống sẽ làm.

Người đầu tiên -n là bài kiểm tra. Nó sẽ trở lại true nếu đầu ra từ sed lệnh khác 0. Cách duy nhất đầu ra từ sed có thể khác 0 là nếu một dòng phù hợp được tìm thấy. Nếu đúng như vậy, $substring phải được tìm thấy trong $string.

Đây là “subsed.sh.”

#!/bin/bash

string="Sweden"
substring="eden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

Chúng tôi nhận được phản hồi mong đợi khi chúng tôi chạy tập lệnh.

./subsed.sh

Chạy tập lệnh subsed.sh

Chúng tôi có thể kiểm tra tính logic của tập lệnh bằng cách chỉnh sửa giá trị của $substring để so sánh không thành công.

./subsed.sh

Chạy tập lệnh subsed.sh với một chuỗi con chưa khớp

Ngừng tìm kiếm, đã tìm thấy nó

Các công cụ khác có thể tìm thấy các chuỗi con, chẳng hạn như awkPerl nhưng một trường hợp sử dụng đơn giản như tìm một chuỗi con không đảm bảo chức năng bổ sung của chúng cũng như không tăng thêm độ phức tạp. Đặc biệt, việc sử dụng nội trang Bash để tìm kiếm các chuỗi con rất nhanh chóng, đơn giản và không yêu cầu các công cụ bên ngoài.

CÓ LIÊN QUAN: Cách sử dụng các câu lệnh trường hợp trong Bash Scripts

dịch vụ cài win online từ xa

[ad_2]

Vui lòng đánh giá về dịch vụ tại nhà