位置の代わりに文字を使用して部分文字列を抽出する

位置の代わりに文字を使用して部分文字列を抽出する

私は最近Nautilusスクリプトを使い始めましたが、作成しているスクリプトの場合はファイル名から部分文字列を抽出する必要があります。私の問題は、私が基礎を築く方法をたくさん見つけたことです。場所文字列内の特定の文字を検索し、その文字からその文字まで部分文字列を抽出する方法についての内容ではない文字。

cut -f1 -d "delimiter"

有効ですが、cut1つの文字区切り文字のみを使用できます。

たぶんawkそれともexpr

編集:
私はbashで書いています。たとえば、次の名前のファイルがあるとします。

[email protected]

単に名前を変更してください。

Any Series S01 E01 VOSTFR.avi

答え1

POSIX シェルの場合は、次を使用します。パターン除去パラメータ拡散演算子(元のKornシェルから):

string=whateverDELIMrestDELIMmore
before_first_DELIM=${string%%DELIM*}
before_last_DELIM=${string%DELIM*}
after_first_DELIM=${string#*DELIM}
after_last_DELIM=${string##*DELIM}

答え2

このスクリプトをどのように使用したいのかをすでに書き留めておけば、より具体的な答えを出すことができますが、次の行だけを使用してもニーズに合わせて適用できるようです。

$ echo "abcde" | awk '{print substr($0, index($0, "c"))}'
cde

index2番目のパラメータを目的の文字に置き換えます。

答え3

パラメータ拡張は実際に操作を実行します。

echo ${1%.S??E*}|sed 's/\./ /'

シリーズ名をエコーし​​、潜在的な点を空白に変更します。どのシリーズにも適用できませんが(Mr. Robotにはポイントが必要です)、これは十分に近いです。

答え4

例だけを提示しました。より多くの方が良いでしょう!

[email protected]

あなたはそれを次のように分割したいと思います:

  • Any Series
  • S01
  • E01
  • VOSTFR
  • avi

一見すると、これは、最初のフィールド(名前)に他の場所で使用される区切り文字を含めることができるRPMパッケージの命名問題とは大きく異なりません。しかし、2つのフィールドに分割したい固定フォーマットフィールドがあるとします。

そのために私は別れるでしょうシーズン+エピソード:

IFS=';' episode=( $(echo "$FILENAME"|sed -E 's/(.+)\.(S[0-9]{2})(E[0-9]{2})\.([^\.]+)\..*\.([^\.]+)/\1;\2;\3;\4;\5/') )

割り当て範囲の区切り文字をセミコロンに設定し、正規表現の出力を bash 配列に挿入します。この配列には5つのフィールドがあります。${episode[0]} .. ${episode[4]}

エピソード名フィールドのドットをスペースに拡張しませんでした。おそらく一度にすべてを行うことができますが、個別に処理すると、アンダースコアの使用などの操作を実行したり、- ..>の場合は二重検索などの複雑さを追加できます。簡単に:Mr..RobotMr. Robot

episode[0]="${episode[0]//./ }"

より複雑にするには、.「」などの略語を表す場所に保管してくださいMr. Robot

episode[0]="$(echo "${episode[0]}"|sed -E 's/\.([^\.])/ \1/g')"

最後に、配列拡張を使用してターゲットファイル名を設定して、スペース、ピリオド、最後のフィールドで区切られたフィールド#0の4つのフィールドを印刷します。

TARGET="${episode[@]:0:4}.${episode[4]}"

FILENAMEその後、 and を渡すとTARGET引用符mvを使用するのが安全です。

mv "$FILENAME" "$TARGET"

関連情報