cse
항상 3-5자로 시작하는 문자열의 하위 문자열과 동일한 변수를 설정하려고 합니다 .
예를 들어, 입력 문자열이 다음과 같은 경우
http://website.com/class/cse111/homework2/test.html
그냥 추출하고 싶은데
cse111
이 문자열에서.
나는 열심히 노력했다
coursenum=$(grep -o '[^cse]...')
하지만 작동하지 않습니다. 이 문제를 해결하는 방법을 아는 사람이 있나요?
감사합니다,
답변1
정규식이 잘못되었습니다. grep -Eo 'cse[^/]{3,5}'
작동합니다.
cse
문자 그대로 문자열 일치[^/]{3,5}
다음 3~5개의 존재하지 않는 문자와 일치합니다./
관련 부분이 항상 구분된 다섯 번째 필드인 경우 이 필드를 대신 /
사용할 수 있습니다 .cut -d/ -f5
답변2
보여주신 할당 명령이 실제로 스크립트에 있는 내용이라면 두 가지 문제가 있습니다.
첫째, 작업에 대한 정규식이 잘못되었습니다. 귀하의 표현식은 문자열을 찾습니다아니요
c
,s
또는e
,( 실제로 수행하는 작업) 로 시작하면[^cse]
첫 번째 문자 뒤에 임의의 세 문자(...
)가 나오므로 총 4자만 가져옵니다.둘째, 당신은 논쟁을 놓쳤습니다
grep
.
을 사용 bash
하고 소스 문자열이 변수에 저장되어 있는 경우 $courseurl
다음을 사용할 수 있습니다.
coursenum="$(grep -o 'cse[^/]\{3,5\}' <<< "$courseurl")"
"여기 문자열"을 지원하지 않는 다른 쉘에서는 다음을 사용하십시오.
coursenum="$(echo "$courseurl" | grep -o 'cse[^/]\{3,5\}')"
그 외에도 강좌 번호가 항상 강좌 URL의 세 번째 구성 요소인 경우 @ArkadiuszDrabcyz의 의견과 @Devon의 솔루션이 올바른 방향을 알려줄 것입니다.
일반적으로 정규식을 처음 사용하는 경우 다음과 같은 내용을 살펴보는 것이 좋습니다.정규식또는정규 표현식 101정규식을 테스트하고 요구 사항과 일치하는지 확인할 수 있습니다.
답변3
/
문자열에 다섯 번째로 구분된 문자열을 원하는 경우 :
$ cut -d '/' -f 5 <<<'http://website.com/class/cse111/homework2/test.html'
cse111
cse
다음으로 시작하고 끝나는 문자열을 원하는 경우 /
:
$ grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html'
cse111
그런 다음 다음과 같은 명령 대체에 사용하십시오.
num=$( grep -o 'cse[^/]*' <<<'http://website.com/class/cse111/homework2/test.html' )
[^cse]
무엇이든 일치한다는 점에 유의하세요 .하나의c
, s
또는 가 아닌 문자 e
이며 .
단일 문자와 일치합니다.
답변4
다음을 사용하여 이 문제를 해결할 수도 있습니다.sed
coursenum=$(sed 's/^.*\(cse[^/]*\)/.*$/\1/' <<< "${website_url}")
또는 bash 매개변수 대체를 사용하세요.
coursenum=cse${website_url#*cse}
coursenum=${coursenum%%\/}