내 스크립트에서 오류 찾기

내 스크립트에서 오류 찾기

사이트 이름(예 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. 정규식 구분 기호로 사용할 때만 필요하며 /, 기본값은 sedor 입니다(일반적으로 or , or 와 perl같은 다른 구분 기호를 사용하는 것이 더 좋습니다 ).,:=

/대신 일반 un-escaped 를 사용하세요 \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"

관련 정보