在 shell 腳本中從字串中提取單詞

在 shell 腳本中從字串中提取單詞

我有一個字串 $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

您如何確定要提取哪些字元?如果字元總是出現在字串中的特定位置,例如,如果它是固定長度的字串或您需要的字元是點和3 個字元擴展名之前的最後21 個字符,則可以在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'

相關內容