Sedコマンド内の正規表現の問題に直面する

Sedコマンド内の正規表現の問題に直面する

次のコマンドを実行するとします。

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==は、ドット()で始まる文字列の最初の部分を置き換えます(すべての項目に一致するオプションが最後にないため)。その後\.、ドット()ではなくゼロ個以上の*()文字が[^.]配置されます。文字列($)、空の文字列(//)。

関連情報