シェルスクリプトで文字列から単語を抽出する

シェルスクリプトで文字列から単語を抽出する

文字列は $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

何を削除し、何を残すかをどのように選択するかがまったく明確ではありません。これは、求めている結果を得るための多くの方法の 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'

関連情報