この複雑な正規表現の機能は何ですか?

この複雑な正規表現の機能は何ですか?

この正規表現は何を置き換えますか?

\([^:]*\):\(.*\)

答え1

この正規表現は通常、/etc/passwdファイルからユーザー名を抽出するために使用されます。例えば

sed 's/\([^:]*\):\(.*\)/\1/' /etc/passwd

パスワードのみに基づいてユーザー名を返しますpasswd

1st Capturing Group ([^:]*)

Match a single character not present in the list below [^:]*
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
: matches the character : literally (case sensitive)
: matches the character : literally (case sensitive)
2nd Capturing Group (.*)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times 

要するに。

最初の部分:

    sed 's/\([^:]*\):    
          /\([^:]*\): Match the string till you see a colon `:` and group.

2番目の部分:

   sed \(.*\)/\1/' /etc/passwd
       \(.*\)  Match everything after `:` and group

2つのグループがあるので、それをback-reference使用して\1最初のグループを参照し、その結果を印刷しようとしていることを示します。

答え2

この正規表現は置換を実行せず、コンテキストのない正規表現にすぎません。

完全なコマンドを知る必要があります。ただし、このパターンが適切であると仮定できます。

(any symbol except : repeated zero or more times):(any symbol remeated zero or more times)

/etc/passwdしたがって、このパターンを使用してユーザー名を取得できます。

sedオプションを使用して-r省略でき()、パターンが最も簡単になります。 「s//\1/」にパターンを挿入します。

sed -r 's/([^:]*):(.*)/\1/' /etc/passwd

出力は次のとおりです。

root
daemon
bin
sys
sync
games

答え3

これにより、文字列の最初のコロンのみを削除できます。

sed 's/\([^:]*\):\(.*\)/\1\2/' <<<"Hello:Unix:Users"
HelloUnix:Users

これは\([^:]*\)、コロンでないまで(またはコロンが表示されないまで)何でも一致します。

次に、対応する...\):\(...コロンを一致させます。そして\(.*\)それ以降のすべて。ただし、\(..\)使用すると、これはsed一致セットとそのインデックス(またはデフォルトback-references)最初の項目は\1、次の項目\2はです。

sed交換部分に誰がこれを使用したいのかが重要なので、おそらく最初のコロンをセミコロンに変更したいかもしれないことに言及したかもしれません。

sed 's/\([^:]*\):\(.*\)/\1;\2/' <<<"Hello:Unix:Users"

あるいは、次の間にコロンの代わりに別の文字列を追加したい場合があります。

sed 's/\([^:]*\):\(.*\)/\1 Linux and \2/' <<<"Hello:Unix:Users"

または何でもでき、交換することができます:)

答え4

これは、最初のコロンの前のすべてとそれの後のすべてをキャプチャする基本正規表現(拡張正規表現ではない)です。

拡張正規表現として、入力の括弧で囲まれたビット自体に括弧が含まれていないと仮定して、コロンの前に括弧で囲まれた文字列を一致させ、コロンの後に括弧で囲まれた別の文字列を一致させます。

デフォルトの正規表現であると仮定すると、入力から2つの文字列をキャプチャfirst partします。second part:third part

first part:second part:third part

\1両方の文字列は、\2使用されているツールによって異なる変数または配列で使用できます。

関連情報