web-dev-qa-db-ja.com

bash regexのどの文字とどのように一致しますか?

Bashスクリプトで、なぜ

message='123456789'
echo "${message//[0-9]/*}"

表示*********

だが

message='123456789'
echo "${message//./*}"

123456789

私が見たすべてのドキュメントは、.がbashであっても正規表現の任意の文字に一致すると述べていますが、それは私にとっては機能しません。 bashのどの文字とどのように一致しますか?

2
CJ Dennis

ドキュメントのどこで.がパターンマッチングでの任意の文字を意味すると言っていますか? man bashには次のように書かれています:

 Pattern Matching

   Any character that appears in a pattern, other than the special
   pattern characters described below, matches itself.  The NUL
   character may not occur in a pattern.  A backslash escapes the
   following character; the escaping backslash is discarded when
   matching.  The special pattern characters must be quoted if
   they are to be matched literally.

   The special pattern characters have the following meanings:
      *      Matches any string, including the null string.
             When the globstar Shell option is enabled, and
             is used in a pathname expansion context, two
             adjacent *s used as a single pattern will match
             all files and zero or more directories and
             subdirectories.  If followed by a /, two
             adjacent s will match only directories and
             subdirectories.

      ?      Matches any single character.

正規表現はシェルパターンマッチングと同じではありません: https://unix.stackexchange.com/questions/439875/why-not-seeing-Shell-globs-as-a-dialect-of-regex =。 Bashで${parameter/pattern/string}構文を使用してすべての文字を別の文字に置き換える場合は、次のように?を使用する必要があります。

$ echo "${message//?/*}"
*********

sedなどの正規表現を使用するプログラムでは、.の代わりに?を使用できます。

$ sed 's,.,*,g' <<< "$message"
*********
2