2010-01-21 24 views
21

Tôi đang cố gắng grep cho một chuỗi nhỏ trong một chuỗi lớn hơn nhiều. Cả hai chuỗi được lưu trữ dưới dạng biến và dưới đây là ví dụ về mã:Làm thế nào tôi có thể grep chuỗi phức tạp trong các biến?

#!/bin/bash 

long_str=$(man man) 
shrt_str="guide" 

if grep -q $shrt_str $long_str ; then 
     echo "Found it!" 
fi 

Tôi không nghĩ rằng mở rộng biến đang hoạt động theo cách tôi mong đợi. Tôi đã thử [ ][[ ]], cũng trích dẫn các biến và đường ống đầu ra đến /dev/null nhưng không có vấn đề gì tôi làm điều đó sẽ không hoạt động.

Có ai có ý tưởng nào không?

+0

https://superuser.com/questions/748724/pass-a-large-string-to-grep-instead-of-a-file-name | https://unix.stackexchange.com/questions/163810/grep-on-a-variable –

Trả lời

31
echo "$long_str" | grep -q "$shrt_str" 
if [ $? -eq 0 ];then 
    echo "found" 
fi 

hoặc

echo "$long_str" | grep -q "$shrt_str" && echo "found" || echo "not found" 

Nhưng kể từ khi bạn đang sử dụng bash shell, sau đó sử dụng shell internals. Không cần phải gọi lệnh bên ngoài

shrt_str="guide" 
case "$long_str" in 
    *"$shrt_str"*) echo "Found";; 
    *) echo "Not found";; 
esac 
+1

Tốt. Câu lệnh case trên phải hợp lệ trong 'sh' gốc. –

+1

có, nó cũng hoạt động trên bourne, nếu không nhầm. – ghostdog74

+0

Điều đó thật hoàn hảo. Cảm ơn. – Craig

13

grep dành cho tệp hoặc tiêu chuẩn. Nếu bạn muốn sử dụng một biến như stdin thì bạn cần phải sử dụng ký hiệu herestring bash của:

if grep -q "$shrt_str" <<< "$long_str" ; then 
6

Bạn muốn

if echo $long_str | grep -q $shrt_str; then 
5

Một kỹ thuật Bash cụ thể:

if [[ $long =~ $short ]] # regex match 
then 
    echo "yes" 
fi 

Nhưng nếu bạn không cần chuỗi dài trong một biến:

if man man | grep $short; then ... 

nhưng tôi m giả định rằng đó chỉ là với mục đích có một ví dụ.

+0

Tôi đã thử giải pháp = ~ nhưng nó không hoạt động. Trang người thử nghiệm cũng không bao gồm "~" làm toán tử. – Craig

+0

'= ~' không phải là toán tử 'test', nó là toán tử Bash (lưu ý các dấu ngoặc vuông kép). Nó cũng hoạt động trong ksh và zsh. –

Các vấn đề liên quan