답변:
당신이 무엇을하고 무엇 pip
을 출력 할 것인지 미리 알지 못한다면 , 당신은 grep
다른 것 이외의 것을 결정할 수도 있습니다 /usr.*
.
당신이 알고있는 경우 와 디렉토리 시작/usr
(그리고 출력의 라인의 끝에 나타납니다 pip
, 그리고 그 /usr
디렉토리의 이름 앞에 선 아무 곳이나 표시되지 않습니다), 그 다음은 좋은 선택이다; heemayl의 대답 이 방법을 알려줍니다.
시작 하는 이유/usr
는 명령을 실행하고 변경하려는 디렉토리를 알고 있기 때문에 명령을 실행하는 더 간단한 해결책을 제안합니다 cd /usr/lib64/python2.7/site-packages
. 탭 완성 기능 을 사용하지 않아도 타이핑이 줄어 듭니다 .
그렇지 않으면 구문 분석되는 출력에 대해 알고있는 내용에 따라 다른 정규 표현식을 선택할 수 있습니다. 아래의 모든 대안은 여전히 디렉토리 이름이 줄 끝에 있다고 가정하지만 다른 가정은 다릅니다.
당신이 알고있는 경우에 디렉토리 이름은 절대 (즉,로 시작 /
) 와 더 /
디렉토리 이름 앞에 줄에 나타납니다은 , 당신은에서와 같은 정규 표현식을 사용할 수 없습니다 heemayl의 대답 만에 /
대신 /usr
:
cd "$(pip install django | grep -o '/.*')"
이것은 모든 문자 ( ) 의 /
0 이상 ( *
) 과 일치합니다 .
.
당신이 알고있는 경우에 디렉토리 이름이 더 수평 공백이 없습니다 (공백이나 탭)과 라인의 끝에 나타납니다 , 당신은 사용할 수 있습니다 :
cd "$(pip install django | grep -oP '[^\h]+$')"
여기서는 약어 (for )가 동일한 확장 정규 표현식 ( ) 보다 타이핑하고 읽기가 더 쉽기 때문에 Perl 정규 표현식 ( -P
)을 사용 했습니다 . 이것은 하나 이상의 (일치 ) 문자 클래스 (어떤 문자 입니다) 하지 ( ) 공백이나 탭 ( ).\h
[:blank:]
-E
+
[
]
^
\h
당신이 t를 알고 있다면 그는 디렉토리 이름은 바로 앞에는 in
수평 공백으로 둘러싸인 (즉, 왼쪽과 오른쪽은 공백으로 모두 채워), 그리고 이의 그러한 사건이다 in
라인에가 , 당신은 사용할 수 있습니다 :
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
이 용도는 제로 폭 긍정적 인 모습 숨김 주장 ( \K
) 하나 개 이상의 문자 (일치하는 .+
공백이나 탭 (뒤에 표시) \h
) in
, 또 다른 하나 이상의 공백 또는 탭 ( \h+
실제로는 포함하지 않고,) in
와 공백 경기에서 그것을 둘러싼. 둘러보기 어설 션 은 Perl 정규식의 기능입니다.
패턴 도 효과가 있었지만 존재하는 수에 관계없이 이전에 하나의 공백 만 찾으면됩니다 . 대조적으로, 우리는 이후의 모든 공백 과 일치해야합니다. 그렇지 않으면 무시되지 않으며 디렉토리 이름의 일부로 일치됩니다.\h+in\h+\K.+
in
in
\K
디렉토리 이름 바로 앞에 행의 마지막in
공백 과 가로 공백 이 오는 것을 알고 있으면 다음을 사용할 수 있습니다.
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
너비가 0 인 양수 룩 어설 션 자체에는 너비가 0 인 음수 룩 어스 어설 션 ( (?!
)
)이 포함됩니다.
!
어려울하는 등의 방법으로 나타납니다 탈출 우아; 내가 전달하기 전에 쉘 히스토리 확장 을 트리거하지 않도록하는 데 사용한 방법 은 명령을 실행하기 전에 grep
히스토리 확장을 일시적으로 사용 안함으로 설정 한 다음 나중에 set +H
다시 사용 가능하게하는 것입니다 ( set -H
). 스크립트에서 이것을 사용하고 스크립트에이 포함되어 있지 않은 set -H
경우, 쉘이 대화식으로 실행될 때만 히스토리 확장이 자동으로 활성화되므로이를 수행 할 필요가 없습니다.
마지막으로, 참고 이들 중 아무도 없으며 것을 heemayl의 대답은 , 실제의 출력 배관된다 grep
에을 cd
(의 출력 불구하고 pip
여전히에 파이프되고있다 grep
). 파이프 대신 이 작업에 적합한 도구는 명령 대체 입니다.
` and
'`이며 grep 표현식 주위에 작은 따옴표를 사용했습니다.
!
거기 인용되지 '
는 AS, -quotes '
-quotes 자체가 인용이다. 이 명령의 복잡성으로 인해 효과를 잘못 예측하기가 쉽지만 확장 순서 ( !
초기) 로 인해x=foo; echo "'$x'"
(-> 'foo'
) 와 같이 작동 합니다. 외부 제거 "
-quotes하는 원인이 !
될 '
-quoted 역사 확장을 방지하지만, 다음 cd
디렉토리의 이름에 공백이있는 경우 실패합니다.