私は最近Nautilusスクリプトを使い始めましたが、作成しているスクリプトの場合はファイル名から部分文字列を抽出する必要があります。私の問題は、私が基礎を築く方法をたくさん見つけたことです。場所文字列内の特定の文字を検索し、その文字からその文字まで部分文字列を抽出する方法についての内容ではない文字。
cut -f1 -d "delimiter"
有効ですが、cut
1つの文字区切り文字のみを使用できます。
たぶん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
index
2番目のパラメータを目的の文字に置き換えます。
答え3
パラメータ拡張は実際に操作を実行します。
echo ${1%.S??E*}|sed 's/\./ /'
シリーズ名をエコーし、潜在的な点を空白に変更します。どのシリーズにも適用できませんが(Mr. Robotにはポイントが必要です)、これは十分に近いです。
答え4
例だけを提示しました。より多くの方が良いでしょう!
あなたはそれを次のように分割したいと思います:
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..Robot
Mr. 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"