前の質問に対するフォローアップです。」sedは、その行の最初のパターン一致のみを印刷します。」
私が取り組んでいるデータ
... "one" ... "two" ... "three" ...
印刷したいのですが、one
受け入れられる答えは次のとおりです。
sed 's/[^"]*"\([^"]*\)".*/\1/'
この正規表現を検索して理解しようとしましたが、この正規表現を理解できませんでした。
私の理解は次のとおりです
[^"]
一致しないことを示します。"
*
0 以前のすべての文字数と一致することを示します。*
\(
\)
後でその番号で参照できるように、2つの間に一致するすべての項目を保存することを意味します。つまり、私たちの場合\1
.*
貪欲です。つまり、任意の文字数を意味します。
[^"]*
ここの意味を理解していません。
ここで何が起こっているのかを理解するために、正規表現全体を口頭でどのように読むべきですか?
sed 's/[^"]*"\([^"]*\)".*/\1/'
答え1
NODE EXPLANATION
--------------------------------------------------------------------------------
[^"]* any character except: '"' (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
" '"'
--------------------------------------------------------------------------------
\( group and capture to \1:
--------------------------------------------------------------------------------
[^"]* any character except: '"' (0 or more
times (matching the most amount
possible))
--------------------------------------------------------------------------------
\) end of \1
--------------------------------------------------------------------------------
" '"'
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
sed
コマンドの2番目の部分は、\1
括弧を使用して「キャプチャされた」エントリを呼び出します。完全なコマンドsed
自体は正規表現ではないことに注意してください。構成では、s/needle/pin/g
正規表現は、またはneedle
正規表現を「包装」したい場合(例:for awk
)です/needle/
。
答え2
[^"]*
これは「引用符ではなくすべての文字数」を意味し、正規表現は欲張りなsed
ので、次[^"]*
の引用符が文字列の最初の引用符であることを確認してください。 2番目の同様の正規表現は、次の引用符が文字列の2番目の引用符であることを保証します。.*
2番目の引用符の後に続くものと一致します。
つまり、[^"]*"\([^"]*\)".*
「行全体を一致させ、2番目の引用符で区切られたフィールドを入力します\1
」を意味します。