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 は を含むすべての行を正しく に置き換えましaaaa

答え3

sed の動作は正しく、入力文字列が編集されて出力されます。当然、入力文字列に指定されたトークンと一致するものがない場合、結果は入力文字列のままになります。regex="aa" の場合、評価されたトークンは一致せず、= "blossom" が出力されます。

答え4

'sed' を使用せずに実行したい場合は、次のようにします。

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

関連情報