2013-06-16 3 views
12

제목에서 알 수 있듯이 변수의 시작 부분과 끝 부분에서 정의 된 패턴을 제거하는 방법을 찾고 있습니다. 내가 #%을 사용해야한다는 것을 알고 있지만 올바른 구문을 모른다. 이 경우 변수의 시작과 끝 모두에서 부분 문자열 일치 패턴 제거

, 나는 file.txt에서 읽어 변수 $line의 끝에서 시작 부분에 http:///score/을 제거 할.

+0

패턴의 종류는? 조금 더 구체적 일 수 있습니까? –

+0

예,이 경우 : http : //는 처음에,/score /는 끝에 있습니다. $ line은 file.txt에서 읽습니다. – bobylapointe

+0

당신이 찾고있는 것은 매개 변수 확장, 특히이 섹션의 끝 부분에있는'$ {parameter # word}'및'$ {parameter % word}'에 대한 것입니다. Bash 매뉴얼] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown

답변

17

글쎄, 당신이 둥지 ${var%}/${var#} 작업을 할 수 없습니다, 당신은 임시 변수를 사용해야합니다 그래서.

여기처럼 :

some_variable="$(echo "$var" | sed -e 's#^http://##; s#/score/$##')" 
+0

나는 정규 표현식에 익숙하다.이건 재미 있네. 나는 sed 조금 알고있다. 문제는 다른 명령에서 sed가 사용하는 출력을 사용하는 방법입니다. 스크립트를 시작한다고 가정 해 봅시다. ./script.sh $ variablemodifiedbysed – bobylapointe

+2

sed의 결과가 변수에 저장되어 재사용 될 수 있음을 보여주는 해답을 업데이트했습니다. –

+0

이것은 마침내 매력처럼 작동합니다. 나는 이것을 알아내는 데 2 ​​시간을 보냈다. 나는 다른 사람들도 잘 작동한다고 확신하지만 정규 표현식을 사용하는 것을 좋아합니다. 고마워요! – bobylapointe

2

당신은 2 단계에서 그것을 할 수 있습니다

$ string="fooSTUFFfoo" 
$ string="${string%foo}" 
$ string="${string#foo}" 
$ echo "$string" 
STUFF 
+0

필자의 경우 문자열은 'boo'또는 'foo'로 시작하거나 시작하지 않을 수 있습니다. 그리고 그것들 중 어떤 것으로 시작하면 어떻게 OR을 구문 분석에 구현하여 문자열의 처음부터 "부"또는 "foo"를 제거 할 수 있습니까? – Nazar

2
$ var='https://www.google.com/keep/score' 
$ var=${var#*//} #removes stuff upto // from begining 
$ var=${var%/*} #removes stuff from/all the way to end 
$ echo $var 
www.google.com/keep 
2

에만 내장 사용하여 그것을 한 단계를 할 수있는 방법이 있나요 : 또는

var="http://whatever/score/" 
temp_var="${var#http://}" 
echo "${temp_var%/score/}" 

, 당신은 (예를 들어) 나오지와 정규 표현식을 사용할 수 있습니다 -inbash 기능 (sed과 같은 실행중인 외부 프로그램 없음) - with BASH_REMATCH :

url=http://whatever/score/ 
re='https?://(.*)/score/' 
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}" 

=~ 테스트의 오른쪽에있는 정규 표현식과 일치하며 그룹을 BASH_REMATCH 배열에 넣습니다. 말했다


, 그것은 두 개의 PE 식 및 임시 변수를 사용하는 것이보다 기존의 : 위의 예에서

shopt -s extglob 
url=http://whatever/score/ 
val=${url#http?(s)://}; val=${val%/score/} 
printf '%s\n' "$val" 

을 ...의 extglob 옵션은 쉘이 "인식 할 수 있도록하는 데 사용됩니다 extglobs "- glob 구문에 대한 bash의 확장 기능 (glob 스타일의 패턴을 일반 표현식과 유사하게 만들기). ?(foo)foo이 선택 사항임을 의미합니다. 예를 들어, 변수의 내용이 -e 또는 -n입니다 경우를 고려 - echo의 행동의 많은 구현 정의이기 때문에 그런데


, 나는이 예제에서 echoprintf를 사용하는 대신하고 있습니다.

0

방법

에 대한
export x='https://www.google.com/keep/score'; 
var=$(perl -e 'if ($ENV{x} =~ /(https:\/\/)(.+)(\/score)/) { print qq($2);}')