Cygwinでgrepを使用して一致する単語を抽出する

Cygwinでgrepを使用して一致する単語を抽出する

私はCygwinを使っていてPOSIX正規表現情報を見ました。

XMLファイルから文字列を検索しようとしていますが、行全体を引き続き取得しますが、探しているいくつかの文字で結果を絞り込むことはできないようです。

ファイル(file1)には複数のインスタンスがあります。

<!ENTITY abc123456 SYSTEM "../blah/abc123456.xyz" NDATA xyz>
<!ENTITY abc123457 SYSTEM "../blah/abc123457.xyz" NDATA xyz>
<!ENTITY abc123458 SYSTEM "../blah/abc123458.xyz" NDATA xyz>

grep の結果には行全体が表示されますが、結果の範囲を次のように絞り込もうとします。

abc123456.xyz
abc123457.xyz
abc123458.xyz

以下は私に次の行を正常に提供します。

grep -E abc[[:digit:]] file1
grep abc[0-9] file1
grep "abc[[:digit:]]" file1

私が探しているものが行の先頭または末尾にないため、^と$は役に立たないようです。私が探しているものを固定する方法を知りません。私は成功せずにgrepを使って他の多くのバリエーションを試しました。

答え1

よりエレガントなソリューション(おそらく1つ)が必要ですgrep -Pが、単純なアプローチで十分ではない場合は、それを使用して目的の文字列をsedシミュレートして取得できます。grepgrep -o

sed -nr 's/.*SYSTEM "..\/blah\/([^"]*).*/\1/p'

これはデフォルトで文字列全体と一致し、それを探している部分文字列に正確に置き換えられます。

答え2

grepコマンドは、一致する項目を含む行を印刷します。行の一部を一致させるためにどのパターンを使用しても、grepは行全体を印刷します。

GNU grepは、パターンに一致する行の一部のみを選択的に表示できるCygwinに含まれるバージョンです-o

grep -o 'abc[0-9][^"]*' file1

\bパターンの先頭に追加してスペースを一致させるか、句読点の後に追加することができます。つまり、一致を避けてください/fooabc123.xyz/または、後で具体的に一致させる場合は、"句読点が出力に含まれます。リバース主張Perl正規表現構文で使用できます。

grep -o -P '(?<=[/"])abc[0-9][^"]*' file1

関連情報