grepは文字列の正確に2つの部分と一致します。

grepは文字列の正確に2つの部分と一致します。

grepコマンドを使用して次の文字列の一部を取得するには?

ひも:

orange:"orange", red:"apple", purple:"grape", yellow:"banana", green:"watermelon"
red:"strawberries", yellow:"lemon"

私が望むもの:

red:"apple" yellow:"banana"
red:"strawberries" yellow:"lemon"

私はこれを試しました:

grep -oP '(red:\"[^\"]*).*(yellow:\"[^\"]*)'

答え1

中間項目は.*すべての項目と一致します。つまり、purple:"grape"部分項目です。代わりに(GNU grepを使い続けると仮定すると)、(foo|bar)「OR」構造を使用して各部分を個別に一致させます。

grep -oP '(red|yellow):\"[^\"]*"'

最後の声明を追加する必要があります"。また、脱出する必要がないので、"次のものを使用できます。

grep -oP '(red|yellow):"[^"]*"'

とにかく、ここにあなたのためのものがあります。

red:"apple"
yellow:"banana"

次に、線の間にスペースを置いて線を接続します。

grep -oP '(red|yellow):"[^"]*"' | paste -sd ' ' -

正直に言うと、自然に代わりsedに使うようになりそうです。

sed -n 's/.*\(red:"[^"]*"\).*\(yellow:"[^"]*"\).*/\1 \2/p'

答え2

grepコンテンツは通常オフラインで抽出されません。p正規表現に一致する行を印刷します(通常はコマンド名にちなんで命名されます)。regg/re/p ed

ただし、一部の実装(たとえばgrep、使用中のように見えるGNU)では、-oこれらの機能の一部が拡張として必要です。

pcregrepさらに進む。-o行の完全一致部分ではなく、キャプチャグループの内容を出力するためにオプションの数値引数を使用できます。

pcregrep -o1 -o2 --om-separator=' ' '(red:"[^"]*").*(yellow:"[^"]*")'

できることにはまだ限界があります。

行から情報を抽出してより多くの変換を実行するには、他の人がここに示すように代わりにテキストsフローを使用する必要があります。ed

答え3

grepあなたは本当にこれを行うことができますスパークホークが提案した、またはほぼ同じです。

$  echo 'red:"apple", purple:"grape", yellow:"banana"' |      
        grep -oP '(red|yellow):".+?"' | perl -00pe 's/\n/ /'
red:"apple" yellow:"banana"

個人的に私はおそらく次のようにしますperl

$ echo 'red:"apple", purple:"grape", yellow:"banana"' | 
    perl -F, -ane 'map{print if /red|yellow/}@F'
red:"apple" yellow:"banana"

関連情報