bash에서 특정 하위 문자열 패턴과 동일한 변수를 설정하는 방법은 무엇입니까?

bash에서 특정 하위 문자열 패턴과 동일한 변수를 설정하는 방법은 무엇입니까?

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%%\/}

관련 정보