사이트 이름(예 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
. 정규식 구분 기호로 사용할 때만 필요하며 /
, 기본값은 sed
or 입니다(일반적으로 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"