`sed` 정규식 오류

`sed` 정규식 오류

도커 컨테이너의 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의 가능성에 대한 좋은 개요와 몇 가지 유용한 예제가 포함된 또 다른 블로그 게시물입니다.

관련 정보