sed 不區分完整的正規表示式匹配和不匹配

sed 不區分完整的正規表示式匹配和不匹配

我想提取與正規表示式匹配的字串的一部分。考慮以下正確運行的程式碼:

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 正確地取代了包含aaby 的所有行aa

答案3

sed 的行為是正確的,它會印出輸入字串 EDITED。顯然,如果輸入字串與給定標記沒有任何匹配,則結果就是輸入字串。當 regex="aa" 時,評估的標記不匹配並列印出 =“blossom”。

答案4

如果您想不使用“sed”,以下內容應該有效:

[[ $string == *$regex*  ]] && echo $regex

相關內容