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
正規表現に一致する行を印刷します(通常はコマンド名にちなんで命名されます)。r
e
g
g/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"