제목에서 알 수 있듯이 변수의 시작 부분과 끝 부분에서 정의 된 패턴을 제거하는 방법을 찾고 있습니다. 내가 #
과 %
을 사용해야한다는 것을 알고 있지만 올바른 구문을 모른다. 이 경우 변수의 시작과 끝 모두에서 부분 문자열 일치 패턴 제거
file.txt
에서 읽어 변수
$line
의 끝에서 시작 부분에
http://
및
/score/
을 제거 할.
제목에서 알 수 있듯이 변수의 시작 부분과 끝 부분에서 정의 된 패턴을 제거하는 방법을 찾고 있습니다. 내가 #
과 %
을 사용해야한다는 것을 알고 있지만 올바른 구문을 모른다. 이 경우 변수의 시작과 끝 모두에서 부분 문자열 일치 패턴 제거
file.txt
에서 읽어 변수
$line
의 끝에서 시작 부분에
http://
및
/score/
을 제거 할.
글쎄, 당신이 둥지 ${var%}
/${var#}
작업을 할 수 없습니다, 당신은 임시 변수를 사용해야합니다 그래서.
여기처럼 :
some_variable="$(echo "$var" | sed -e 's#^http://##; s#/score/$##')"
나는 정규 표현식에 익숙하다.이건 재미 있네. 나는 sed 조금 알고있다. 문제는 다른 명령에서 sed가 사용하는 출력을 사용하는 방법입니다. 스크립트를 시작한다고 가정 해 봅시다. ./script.sh $ variablemodifiedbysed – bobylapointe
sed의 결과가 변수에 저장되어 재사용 될 수 있음을 보여주는 해답을 업데이트했습니다. –
이것은 마침내 매력처럼 작동합니다. 나는 이것을 알아내는 데 2 시간을 보냈다. 나는 다른 사람들도 잘 작동한다고 확신하지만 정규 표현식을 사용하는 것을 좋아합니다. 고마워요! – bobylapointe
당신은 2 단계에서 그것을 할 수 있습니다
$ string="fooSTUFFfoo"
$ string="${string%foo}"
$ string="${string#foo}"
$ echo "$string"
STUFF
필자의 경우 문자열은 'boo'또는 'foo'로 시작하거나 시작하지 않을 수 있습니다. 그리고 그것들 중 어떤 것으로 시작하면 어떻게 OR을 구문 분석에 구현하여 문자열의 처음부터 "부"또는 "foo"를 제거 할 수 있습니까? – Nazar
$ 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
에만 내장 사용하여 그것을 한 단계를 할 수있는 방법이 있나요 : 또는
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
의 행동의 많은 구현 정의이기 때문에 그런데
echo
을
printf
를 사용하는 대신하고 있습니다.
방법
에 대한export x='https://www.google.com/keep/score';
var=$(perl -e 'if ($ENV{x} =~ /(https:\/\/)(.+)(\/score)/) { print qq($2);}')
패턴의 종류는? 조금 더 구체적 일 수 있습니까? –
예,이 경우 : http : //는 처음에,/score /는 끝에 있습니다. $ line은 file.txt에서 읽습니다. – bobylapointe
당신이 찾고있는 것은 매개 변수 확장, 특히이 섹션의 끝 부분에있는'$ {parameter # word}'및'$ {parameter % word}'에 대한 것입니다. Bash 매뉴얼] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown