次のコマンドを実行するとします。
export STR="abcdef.ghijkl.mnopqr.stuvwy.log"
echo $STR | sed 's/\.[^.]*$//'
私は次のような結果を得ます。
abcdef.ghijkl.mnopqr.stuvwy
上記の結果は理解できません。
答え1
sedパターンには、\.[^.]*$
元の文字列と一致するものが1つだけあります.log
。
詳細:
\.
ドット文字のみが一致します。[^.]
何でも他と一致.
[^.]*
以下の文字シーケンスと一致します。.
$
行の終わりと一致します。
したがって、ここで最後の項目.log
は唯一の一致です(.stuvwy.log
内部点が含まれているため、一致ではありません)。sed
コマンドが要求するように空の文字列に置き換えられますs/\.[^.]*$//
。だからあなたは終わります:
abcdef.ghijkl.mnopqr.stuvwy
答え2
必要でない場合は、sed
シェルの組み込みパターン置換を使用できます。これは本当に速く、外部プログラムを呼び出す必要はありません。
${VAR%.*}
.*
glob パターンに一致する項目は次から削除されます。終わり。$VAR
正規表現ではなくglobなので.
文字通り「.」を意味します。
$ foo=aaa.bbbb.2011.log
$ echo ${foo%.*}
aaa.bbbb.2011
バラよりシェルパラメータ拡張BASHのマニュアルページでもっと学びましょう。
答え3
s/\.[^.]*$//
g
==は、ドット()で始まる文字列の最初の部分を置き換えます(すべての項目に一致するオプションが最後にないため)。その後\.
、ドット()ではなくゼロ個以上の*
()文字が[^.]
配置されます。文字列($
)、空の文字列(//
)。