web-dev-qa-db-ja.com

区切り文字を含むファイルパス文字列から部分文字列を抽出する必要がある

シェルスクリプトの実行中、入力文字列は次のようになります。

test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class

抽出方法:test1/test2/Test.jar [つまりシェルスクリプトで「.jar」区切り文字が最初に現れるまでの部分文字列]、

これどうやってするの?カットを使用して、最後に「.jar」を追加したくありません。

ありがとう

6

以下のように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
6
αғsнιη

sedのほか には、 grep をPCRE正規表現^.*?\.jarとともに使用するオプションもあります。

grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"

これは一致(-o)のみを出力し、 PCRE-P)を使用し、次のテキストに一致します:

  • 行の先頭(^)から始まり、そして
  • 任意の文字(.)が含まれていますが、何度も一致します(*?)。
  • リテラル.文字(\.)およびjarjar)が続きます

通常の貪欲な量指定子*?の代わりに lazy量指定子*を使用すると、grepが可能な限り少ない文字に一致します。

  • なしで(代わりに貪欲な数量詞を使用して)、grepは、一致が.jarで終了する限り、できるだけ多くの文字と一致し、first複数ある場合の.jar
  • -Pフラグは、grepがUbuntuでサポートしている正規表現の方言であるため、 PCREは遅延をサポートするもの であるために必要です。 ( この方言Perlの正規表現方言 と非常に似ています。)
7
Eliah Kagan

シェルスクリプトについて言及しているので、単純な、純粋にシェルベースのソリューションを紹介します。

s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"

パラメータ展開%%は、後続の globパターン と一致する最長のサフィックスを削除します.jar*(最短のサフィックスに一致する%とは対照的に)。

6
David Foerster

この質問には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を追加します

3

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
3
Jacob Vlijm