我想提取與正規表示式匹配的字串的一部分。考慮以下正確運行的程式碼:
regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"
輸出是:
ss
但是,如果正規表示式沒有符合任何內容,則傳回整個字串。
regex="aa"
輸出:
blossom
這是不正確的。當沒有匹配時,不應返回任何內容。如何才能做到這一點?
答案1
正如 choroba 所說,預設情況下 sed 將始終列印該行以及任何匹配的替換。你可以做你想做的事:
regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"
-n 告訴 sed 不要列印該行,然後 s/ 命令末尾的 p 告訴 sed 列印該行,如果它匹配任何內容,則進行替換。
答案2
你的解釋是錯的。你告訴sed
我們用別的東西代替一些東西;如果它沒有找到任何可以替換的內容,為什麼要刪除任何內容?換句話說,替換會替換匹配的內容,但不會觸及不匹配的行。或者,還有另一個重新表述:sed 正確地取代了包含aa
by 的所有行aa
。
答案3
sed 的行為是正確的,它會印出輸入字串 EDITED。顯然,如果輸入字串與給定標記沒有任何匹配,則結果就是輸入字串。當 regex="aa" 時,評估的標記不匹配並列印出 =“blossom”。
答案4
如果您想不使用“sed”,以下內容應該有效:
[[ $string == *$regex* ]] && echo $regex