テキスト文字列を想定します。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
grep
libpcre 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=
置き換えます。#
##