$sea = xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz와 같은 문자열이 있습니다.
DMJK.UK.1.0-32133-Z-1만 추출하고 싶고 검색 문자열은 DMJK입니다.
나는 다음과 같이 시도했다
echo $sea
y=${sea/\/*\//};
echo ${y/.*/};
하지만 작동하지 않습니다. 도와주세요
답변1
제거할 항목과 유지할 항목을 선택하는 방법이 전혀 명확하지 않습니다. 이는 요청한 결과를 얻는 여러 방법 중 하나입니다.
$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz
$ sea2=${sea/*[[:lower:]]-/}; echo ${sea2%.*}
DMJK.UK.1.0-32133-Z-1
또는 여기에는 DMJK
최종 부분으로 시작하고 끝나는 부분이 포함됩니다 .tgz
.
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1
.tgz
이 동일한 접근 방식은 이 존재하지 않는 경우에도 작동합니다 .
$ sea=xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1
$ sea2=${sea/*DMJK/DMJK}; echo ${sea2%.tgz}
DMJK.UK.1.0-32133-Z-1
답변2
추출할 문자를 어떻게 결정합니까? 문자가 항상 문자열의 특정 위치에 나타나는 경우, 예를 들어 고정 길이 문자열이거나 필요한 문자가 점 앞의 마지막 21자이고 확장자 3자인 경우 Bash 스크립트에서 다음 중 하나를 사용할 수 있습니다.
sea="xyz-ajay-no-siddhart-ubidone-fdh-DMJK.UK.1.0-32133-Z-1.tgz"
echo $sea
# If characters are always in positions 33 to 50
y=${sea:33:21}
echo $y
# If y always start 5 positions from the end and goes back 21 characters
# For negative numbers you need to put a space between the colon and the
# number
#
# Get the last 25 characters in the string
y=${sea: -25}
# Now discard the last 4, which are the dot and 3 character extension
y=${y:0:21}
echo $y
답변3
변수가 다른 인스턴스에서 어떻게 보이는지에 따라 다릅니다.
다음과 같이 간단할 수 있습니다.
echo $sea | cut -d '-' -f 7- | cut -d . -f -4
또는
echo $sea | sed 's#.*\(DMJK.*\).tgz#\1#g'