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