내 스크립트에서 오류를 발견했습니다

내 스크립트에서 오류를 발견했습니다

웹사이트 이름(예 https://google.com/etc: )을 가져와야 하는 지저분한 스크립트가 있습니다.

#!/bin/bash

ARTIST=$(echo "$@" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g")

echo $(echo "$@" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g")
echo "$ARTIST"

echo "$@"

어떤 이유로 $(...)스크립트 외부에서 실행하면 아무 것도 반환하지 않습니다. 이는 훌륭하게 작동합니다.

$ ./test.sh https://nothing.bandcamp.com/music   
https://nothing.bandcamp.com/music 

예상되는 동작:

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g" 
Nothing.Bandcamp

내가 뭘 잘못했나요?

답변1

정규식에서 \자신을 탈출했습니다 grep. 즉, \\/문자 그대로의 백슬래시 뒤에 슬래시가 오는 것을 의미하고 \\K문자 그대로의 백슬래시 뒤에 대문자 K가 오는 것을 의미합니다.

또한 /이스케이프를 사용할 필요도 없습니다. 이는 기본적으로 또는 를 사용하는 grep정규식 구분 기호로 사용될 때만 필요합니다 (일반적으로 다른 구분 기호(예: or , 또는 ) 를 사용하는 것이 더 좋습니다 )./sedperl,:=

대신 간단한 unescaped 를 사용하세요 /. \K예를 들어:

#!/bin/bash
ARTIST=$(echo "$@" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g')
echo "$ARTIST"

예제 출력:

$ ./test.sh https://nothing.bandcamp.com/music   
Nothing.Bandcamp

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https://\K.+?(?=.com)' | sed -e 's/\b\(.\)/\u\1/g'
Nothing.Bandcamp

참고: 이는 명령줄에서 실행할 때와 스크립트에서 실행할 때 모두 해당됩니다.

예를 들어, 다음은출력 없음, 스크립트와 동일:

$ echo "https://nothing.bandcamp.com/music" | grep -oP 'https:\\/\\/\\K.+?(?=.com)' | sed -e "s/\b\(.\)/\u\1/g"

관련 정보