正規表現に一致する文字列の一部を抽出したいと思います。正しく実行される次のコードを考えてみましょう。
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はaa
byを含むすべての行を正しく置き換えますaa
。
答え3
sedの動作は正確です。入力文字列EDITEDを印刷します。明らかに、入力文字列に指定されたトークンと一致する項目がない場合、結果は入力文字列です。 regex = "aa"の場合、評価されたタグは一致せず、print = "blossom"です。
答え4
「sed」を使用したくない場合は、次の作業が必要です。
[[ $string == *$regex* ]] && echo $regex