grep正規表現アサーションによる文字列の抽出

grep正規表現アサーションによる文字列の抽出

テキスト文字列を想定します。my_string

$ my_string="foo bar=1ab baz=222;"

bazキーワードとセミコロンの間の英数字文字列を抽出したいと思います。

正規表現アサーションを使用して末尾のセミコロンを除外するように次のgrepコードを変更するにはどうすればよいですか?

$ echo $my_string | grep -oP '(?<='baz=').*'
222;

答え1

抽出したい文字列自体に含まれていない場合、最も簡単な方法は;(単一の文字一致)を(除外されたすべての文字一致)に置き換えることです。.[^;];

$ printf '%s\n' "$my_string" | grep -oP '(?<='baz=')[^;]*'
222

greplibpcre 7.2以降に接続すると、次のように振り返るのを簡単にすることもできます\K

$ printf '%s\n' "$my_string" | grep -oP 'baz=\K[^;]*'
222

これは、一致するテキストに改行文字が含まれていないと仮定して、文字列内のすべての一致を印刷します(grep各入力行は個別に処理されるため)。

答え2

簡単にマッチングも可能です。sed:

sed -n 's/.*baz=\([^;]*\).*/\1/p' <<< $my_string
222

答え3

Steeldriverの答えは正確ですが、読みやすくするために次のことを行います(使用bash)。

my_string="foo bar=1ab baz=222;"
regex='baz=([0-9]+);'
[[ $my_string =~ $regex ]] &&
  echo "${BASH_REMATCH[1]}"

答え4

POSIXシェルの場合:

  • baz=最初の項目と最後の項目の間にあるテキストの場合;

    my_string="foo bar=1ab baz=222;"
    case $my_string in
      (*baz=*\;*)
        result=${my_string#*baz=}
        result=${result%;*};;
      (*) result=
    esac
    
  • 最初の発生とbaz=それ以降の次の発生の間のテキストは上記の内容に置き換えられます。;%%%

  • ~のため最後が表示されたら、にbaz=置き換えます。###

関連情報