次の sed コマンドからエラーを取得します。
echo 20130521_OnePKI_p107336_APP.pfx | sed -e 's/_\([pP][0-9]+\)_/\1/'
を返す代わりにp107336
、完全なファイル名を返してい20130521_OnePKI_p107336_APP.pfx
ます。
なぜこれが起こっているのか、出力を希望のパターンだけに制限する方法はありますか?
キャプチャは括弧でエスケープする必要があり、大文字と小文字を区別しない match を使用できますi
。また、キャプチャ部分をキャプチャ部分に置き換えるため、変更は行われません。これは行全体に一致し、キャプチャされたパターンに置き換えます。
sed -e 's/.*_\([pP][0-9][0-9]*\)_.*/\1/'
もっと簡単な方法は、grep を使用することです。
echo 20130521_OnePKI_p107336_APP.pfx | egrep -o "[pP][0-9]+"
「-o」は、入力の一致する部分のみを出力するように grep に指示します。
原則として、正規表現は、いずれか[pP][0-9]+
で始まるか、1 つ以上の数字が続く部分文字列と一致します。文字列にはそのパターンに一致する部分文字列があるため、文字列全体が正規表現に一致します。p
P
"20130521_OnePKI_p107336_APP.pfx"
左側の正規表現全体を括弧でグループ化し、右側でそれを参照する場合、's/([pP][0-9]+)/\1/'
基本的には「一致をそれ自体に置き換える」と言っています。これにより、最初の文字列と同じ文字列になります。場所。
ここで必要なのは、すでに示したように、文字列全体を最初から一致させてから、その文字列の一部をグループ化することです。次に、右側のその部分を参照して、より大きな文字列から抽出できます。
シェルで作業する場合は、式を適切にエスケープする必要があります。
括弧と . をエスケープする必要があり+
ます。また、すべての文字列を一致させ、すべてを必要な部分のみに置き換えます(.*
文字列の前と最後):
... | sed -e 's/^.*\([pP][0-9]\+\).*$/\1/'