シェルスクリプトの実行中、入力文字列は次のようになります。
test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class
抽出方法:test1/test2/Test.jar
[つまりシェルスクリプトで「.jar」区切り文字が最初に現れるまでの部分文字列]、
これどうやってするの?カットを使用して、最後に「.jar」を追加したくありません。
ありがとう
以下のようにsed
を使用できます。
sed 's/\(\.jar\).*/\1/' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
またはawk
コマンドを使用:
awk -F'\\.jar' '{print $1".jar"}' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
出力は次のとおりです。
test1/test2/Test.jar
sed
のほか には、 grep
をPCRE正規表現^.*?\.jar
とともに使用するオプションもあります。
grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
これは一致(-o
)のみを出力し、 PCRE (-P
)を使用し、次のテキストに一致します:
^
)から始まり、そして.
)が含まれていますが、何度も一致します(*?
)。.
文字(\.
)およびjar
(jar
)が続きます通常の貪欲な量指定子*?
の代わりに lazy量指定子*
を使用すると、grep
が可能な限り少ない文字に一致します。
grep
は、一致が.jar
で終了する限り、できるだけ多くの文字と一致し、first複数ある場合の.jar
。-P
フラグは、grep
がUbuntuでサポートしている正規表現の方言であるため、 PCREは遅延をサポートするもの であるために必要です。 ( この方言 は Perlの正規表現方言 と非常に似ています。)この質問にはbash
というタグが付けられているため、個々の文字を抽出するためのCスタイルループと${variable:beginning:offset}
パラメーター拡張を備えたbash
スクリプトがあります。
#!/usr/bin/env bash
substring=""
for ((i=0;i<=${#1};i++))
do
substring="$substring""${1:$i:1}"
if [[ "$substring" == *.jar ]]
then
echo "$substring"
substring=""
fi
done
これは実際の動作と同じように機能します。
$ ./parse_string.sh test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class
test1/test2/Test.jar
/Test2.jar
最初のオカレンスのみを抽出したい場合は、break
ステートメント内のsubstring=""
の後の行にif
を追加します
python
で:
python3 -c "print('blub/blab/Test.jar/blieb'.split('.jar')[0]+'.jar')"
> blub/blab/Test.jar
または:
python3 -c "s='blub/blab/Test.jar/blieb';print(s[:s.find('.jar')+4])"
> blub/blab/Test.jar