2

キーと値の順序で多くのセグメントを持つ行から単一の文字列を抽出しようとしていますが、必要以上に一致するため取得できません。

これは私の例の行です:

|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~|

この行は、多くのセグメントを 1 行に連結したものです。ここで、SEGA で始まるセグメントのインデックス 2 の文字列を抽出したいと考えています。だから私がすることは、これをgrepすることです:

egrep -o 'SEGA(.*?)\~\|'

しかし、行全体が表示されることもあれば、探しているセグメントのみが表示されることもあります。一致する場合は、~ 文字を使用してそのセグメントを分割し、3 番目のセグメントを取得します。私は .* を使っているので? 疑問符が付いているので、egrep は SEGA と ~| の最初の発生の間のコンテンツのみに一致することを期待していました。これは SEGB の直前にあり、SEGC または SEGB の最後にあるものではありません。

SEGA を検索し、SEGA の直後から ~| が最初に出現するまでコンテンツ全体を表示するように grep に指示するにはどうすればよいですか?

4

2 に答える 2

2

-Pgrep で (--perl-regexp) オプションを使用できます。

grep -oP '(?<=SEGA).*?(?=~\|)' file

末尾を含めたい場合は~|、先読みを削除してください(?=...)

.*?(lazy) は egrep で終了しないと思います。

于 2012-11-06T14:06:31.347 に答える
0

行を複数の行に分割して|から、それらから grepすることをお勧めします。

$ echo "|SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~|SEGB~34~12.11.2011~3~M~O~|SEGC~HELLO~WORLD~|" | sed -e 's/|/\n/g' | grep ^SEGA
SEGA~1~MAGIC~DESCRIPTION~~~M~TEST~
于 2012-11-06T14:05:52.350 に答える