쉘 스크립트의 문자열에서 단어 추출

쉘 스크립트의 문자열에서 단어 추출

$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'

관련 정보