次のファイルのgrep出力があります。
"name" "Andrew Spokes"
名前を抽出するためにgrepの出力をパイプしたいと思いますsed
。
私の予想結果は次のとおりです。
Andrew Spokes
引用符間のスペースもすべて削除してもらいます。
答え1
1つの方法は次のとおりです。
... |sed -r 's/^"[^"]*" *"([^"]*)"$/\1/'
Andrew Spokes
もう一つ:
sed -r 's/(([^"]*"){3})//; s/"//'
または:
sed -r 's/.*"(.*)"$/\1/'
これ[^"]
以外のすべての単一文字と一致します"
。
答え2
次の式はGNU sedで動作します。
sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
これは、行全体に一致する正規表現と、目的の名前を持つ名前部分に一致するサブ式を生成することによって行われます。括弧内の部分で、二重引用符ではなく一連の文字です。一致する完全正規表現は、式の\1
末尾に引用されたサブ式に置き換えられます。
これがどのように機能するかの例を次に示します。
$ # Generate lines in the expected format
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"'
"name" "Andrew Spokes"
"name" "ABC"
"name" "Foo Bar Baz"
$ # Pipe the same lines to the sed command
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"' | sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
Andrew Spokes
ABC
Foo Bar Baz
GNU正規表現の経験が限られている場合は、次のサイトで上記の正規表現で使用されている構文を見つけることができます。GNU sed マニュアル。他のスタイルのsedを使用している場合は、詳細が多少異なる場合があります。 1つのコメントは、-E
「拡張された」正規表現を有効にするオプションです。 GNU sedには、子式と逆参照をエスケープせずに生成するという意味の括弧やバックスラッシュなどの特殊文字があります。別の方法は、行の先頭と末尾で一致する完全な正規表現を使用し^
て要求することです。$
別のコメントは、すべての入力ラインで均一性を仮定する sed 式を使用します。入力にさらに変更がある場合は、調整が必要です。