`sed`正規表現エラー

`sed`正規表現エラー

DockerコンテナのIPを取得するためにエイリアスを作成しようとしています。コマンドは次のとおりです。

docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'

コマンドラインから起動すると正常に動作します。次に挿入しますbash_aliases

alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{ print $2 }' | sed 's/[^"]*"\([^"]*\)".*/\1/'"

ただし、起動時にredis-ip次のエラーが発生します。

sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS

誰でもエラーが何であるかを教えてもらえますか?

答え1

これを行うには、エイリアスの代わりにシェル関数を使用してください。

function redis-ip {
  docker inspect redis |
  grep IPAddress |
  awk 'NR == 3 { print $2 }' |
  sed 's/[^"]*"\([^"]*\)".*/\1/'
}

必要に応じて動作する場合は、コマンドが何を出力するのかわからsedないので、わかりません。docker

答え2

問題は、エイリアスが"二重引用符()で囲まれていることです。これはスクリプト$2からawkシェルではなくシェルに渡され、awkコマンドの二重引用符がエイリアスをsed混乱させることを意味します。これにより、エイリアスは期待どおりに機能するはずです。

alias redis-ip="docker inspect redis | grep IPAddress | awk 'NR==3{print \$2 }' | sed 's/[^\"]*\"\([^\"]*\)\".*/\1/'"

おそらく、より良いと簡単です。機能の使用しかし。

答え3

一般的に、「jsonからデータを解析または抽出するにはjqまたはjsonpipeなどを使用してください」と言いますが、コマンドにはすでに出力フォーマットとフィールドdocker inspect抽出が組み込まれています。

docker inspect興味のあるフィールドのみを返すように指示できます。

alias redis-ip="docker inspect -f '{{.NetworkSettings.IPAddress}}' redis"

または

alias redis-ip='docker inspect -f '\''{{.NetworkSettings.IPAddress}}'\'' redis'

これは(簡単に)に文書化されています。https://docs.docker.com/engine/reference/commandline/inspect/

また、見ることができます検査時に確認すべき事項詳細と例をご覧ください。そしてDocker検査テンプレートマジック出力形式を調べるDockerの可能性の良い概要といくつかの便利な例を含む別のブログ投稿です。

関連情報