웹사이트 이름(예 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 , 또는 ) 를 사용하는 것이 더 좋습니다 )./
sed
perl
,
:
=
대신 간단한 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"