sed は完全正規表現の一致と不一致を区別しません。

sed は完全正規表現の一致と不一致を区別しません。

正規表現に一致する文字列の一部を抽出したいと思います。正しく実行される次のコードを考えてみましょう。

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"

出力は次のとおりです

ss

ただし、正規表現に一致する項目がない場合は、文字列全体が返されます。

regex="aa"

出力:

blossom

これは正確ではありません。一致するものがない場合は何も返すべきではありません。これはどのように達成できますか?

答え1

chorobが言うように、デフォルトでは、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"の場合、評価されたタグは一致せず、print = "blossom"です。

答え4

「sed」を使用したくない場合は、次の作業が必要です。

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

関連情報