이 문자열이 있습니다
extension_dir => /some/path/php/extensions/no-debug-non-zts-20160303 => /some/path/php/extensions/no-debug-non-zts-20160303
sqlite3.extension_dir => no value => no value
이것이 출력입니다 php -i | grep extension_dir
.
첫 번째 것을 얻으려면 bash에서 어떻게 구문 분석합니까 /some/path/php/extensions/no-debug-non-zts-20160303
?
내가 지금까지 시도한 것 :
echo $(php -i | grep extension_dir | sed 's/extension_dir => //g' | sed 's/=> .*//g')
그러나 이것은 나에게 /some/path/php/extensions/no-debug-non-zts-20160303 sqlite3.no value
. 왜 모든 일치 항목을 대체하지 않는지 모르겠습니다.=> .*
내 기본 아이디어는 먼저 그것을 제거한 다음 정규식과 다르게 sed에 의해 일치될 수 있는 항목을 포함하여 extension_dir =>
모든 것을 제거하는 것 입니다.=>
=>
답변1
php -i | sed -n '/extension_dir/{s/^[^/]*//;s/ *=>.*$//;p;}'
아니면 아래 댓글에서 제안한 것처럼,
php -i | sed '/extension_dir/!d;s/[^/]*//;s/ *=>.*//'
위의 내용은 sed
your grep
및 will을 대체하고 일치하는 각 줄에 대해 extensions_dir
먼저 첫 번째 줄 앞의 모든 항목을 삭제한 /
다음 첫 번째 줄부터 =>
모든 것을 삭제합니다.수정됨끈. 이전 공백 =>
도 모두 제거됩니다. 일치하지 않는 행은 extensions_dir
무시됩니다.
그러면 입력의 첫 번째 줄에 필요한 경로가 반환되고 두 번째 줄에 빈 줄이 반환됩니다.
입력의 두 번째 줄을 무시하려면 /^extension_dir/
대신 위를 사용하십시오. 두 번째 줄은 해당 문자열로 시작하지 않기 때문에 삭제됩니다./extension_dir/
sed
sed
두 번째 입력 줄에 대해 놀라운 결과를 생성하는 두 스크립트의 조합입니다 .
라인은
sqlite3.extension_dir => no value => no value
첫 번째는 sed
다음과 같이 수정합니다.
sqlite3.no value => no value
그런 다음 두 번째는 끝에 있는 비트를 sed
제거합니다 .=> no value
알아채다
echo $( ... )
내부 명령 출력에서 개행 문자를 먹기 때문에 쓸모가 없습니다 $( ... )
. 대신, 명령 대체를 사용 echo
하거나 대체 하지 않고 명령만 사용하여 테스트하십시오 $( ... )
.
echo
and 의 출력 특성(하나가 아닌 두 개의 일치하는 행)에 대해 혼란을 주는 것은 이러한 사용법일 수 있습니다 .php -i
grep
답변2
간단한 awk 솔루션을 제공할 수 있습니다.
php -i | awk -F ' => ' '/extension_dir/{print $2; exit}'
sed를 잃고 싶다면 이것이 작동합니다.
편집: 구문 오류를 방지하기 위해 블록 내부에서 종료를 이동하고, 결과 파일 경로와 함께 출력되지 않도록 필드 구분 기호 주위에 공백을 추가하고, 최소 문자 변경 제한으로 인해 stackexchange에서 편집이 허용되도록 본문의 변경 사항을 설명합니다.
답변3
경로에 공백이 없으면 다음 표현식으로 충분합니다.
php -i | grep -Po 'extension_dir => \K/[^ ]*'
입력하다
extension_dir => /some/path/php/extensions/no-debug-non-zts-20160303 => /some/path/php/extensions/no-debug-non-zts-20160303
sqlite3.extension_dir => no value => no value
산출
/some/path/php/extensions/no-debug-non-zts-20160303