正規表現に一致する文字列の一部を抽出したいです。正しく動作する次のコードを考えてみましょう。
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
たaa
。
答え3
sed の動作は正しく、入力文字列が編集されて出力されます。当然、入力文字列に指定されたトークンと一致するものがない場合、結果は入力文字列のままになります。regex="aa" の場合、評価されたトークンは一致せず、= "blossom" が出力されます。
答え4
'sed' を使用せずに実行したい場合は、次のようにします。
[[ $string == *$regex* ]] && echo $regex