正規表現で文字列から特定の値を抽出します。

正規表現で文字列から特定の値を抽出します。

多くの例を見ましたが、これはできないようです。 grepは指定されたグループに一致する出力のみを出力できますか? たとえば、動作する必要があるように見えますが、エラーが発生したりまったく出力されません。

私がしたい:

pathname="/a/long/path/of/mine/2x02 - bar.mp4"

すべての例は、長いパス、1〜2桁の数字、x、2桁の数字、スペース、-、およびファイル名で構成されています。

02 値を解析したい。 https://regex101.com/ この場合、\d{1,2}x(\d\d) は、1 = 02 と一致する必要があることを示します。

私が知らないことは私がそうしたなら

echo "$pathname" | sed -n 's/.*\d{1,2}x\(\d\d\)/\1/p'

または

echo $pathname | grep -oP '\d{1,2}x(\d\d)'

私は何も得られませんでした。私はできます:

echo $pathname | grep -oP '(\d\d)'

しかし、場合によっては、私のように連続して他の2桁の値が出ることがあります。

/a/long/path/of/mine/12x02 - bar.mp4

この場合、上記の内容は2番目の一致を指定しないと思われるため、一致グループなどを使用できる場合は、より具体的な正規表現を優先します。 Scientific Linux 7.1のbashでこれを実行しようとしています。

ベストアンサー1

grepPCRE( ) を使用するのと同様に、-P次の正規表現パターンを使用できます。

grep -Po '\d{1,2}x\K\d{2}(?= )' <<<"$pathname"
  • \d{1,2}x次の1桁または2桁の数字にx一致してから\K一致を削除します。

  • \d{2}2 つの数字が正確に一致する場合、幅 0 の前方予測パターンを使用する(?= )と、2 つの数字の後にスペースがあります。

したがって、これはあなたの要件を満たす必要があります。

例:

$ grep -Po '\d{1,2}x\K\d{2}(?= )' <<<'/a/long/path/of/mine/2x02 - bar.mp4'
02

$ grep -Po '\d{1,2}x\K\d{2}(?= )' <<<'/a/long/path/of/mine/34x12 - bar.mp4'
12

$ grep -Po '\d{1,2}x\K\d{2}(?= )' <<<'/a/long/path/of/mine/0x1 - bar.mp4'
## No match

$ grep -Po '\d{1,2}x\K\d{2}(?= )' <<<'/a/long/path/of/mine/00x1 - bar.mp4'
## No match

おすすめ記事