하위 문자열이 처음 발생한 이후의 모든 것을 가져옵니다.

하위 문자열이 처음 발생한 이후의 모든 것을 가져옵니다.

단일 문자에 대한 솔루션은 많지만 하위 문자열에 대한 솔루션은 없습니다. 가까운 해결책이 있지만 마지막 하위 문자열 이후의 모든 항목이 제거됩니다.

$ echo pkg-new-pkg-20180925-090719.x86_64 | sed -n -e "s/^.*pkg-//p"
20180925-090719.x86_64

난 무엇인가?생각하다예:

$ echo pkg-new-pkg-20180925-090719.x86_64 | ???
new-pkg-20180925-090719.x86_64

이는 분할하려는 하위 문자열의 경우입니다 pkg-. 어떤 아이디어가 있나요?

답변1

변수에서:

var=pkg-new-pkg-20180925-090719.x86_64
printf '%s\n' "${var#*pkg-}"

${var#pattern}패턴과 일치하는 가장 짧은 선행 부분을 제거합니다( ${var##pattern}가장 긴 부분의 경우).

텍스트 입력 스트림에서:

sed 's/pkg-/\
/;s/.*\n//'

이는 다음을 대체합니다.첫 번째pkg-개행 문자 (패턴 공간에 나타나지 않는 문자) 가 발생하고 해당 개행 문자 이전의 모든 항목이 삭제됩니다. 일부 sed구현에서는 이를 작성할 수도 있지만 sed 's/pkg-/\n/;s/.*\n//'이는 이식 가능하거나 표준이 아닙니다.

ast-open 사용 sed( 에서도 작동 ssed -R):

sed -E 's/.*?pkg-//'

그리고 perl:

perl -pe 's/.*?pkg-//'

.*?탐욕스럽지 않은 버전은 어디에 있습니까 .*?

답변2

아래에 언급된 두 가지 방법으로 수행했습니다.

첫 번째 방법

     echo "pkg-new-pkg-20180925-090719.x86_64"| sed "s/pkg-//"
new-pkg-20180925-090719.x86_64

두 번째 방법

echo "pkg-new-pkg-20180925-090719.x86_64"| awk -F "-" '{$1="";print $0}'| sed 's/^ //g'| sed "s/ /-/g"

new-pkg-20180925-090719.x86_64

관련 정보