私は、過去数年間間違った名前のテレビ番組DVDリップの名前を変更するために、Mac OS X 10.6でbashシェルスクリプト(Automator Actionとして呼び出される)を作成しようとしています。ファイル名からテキストの一部を削除したいと思います。ファイル名に常に表示される特定の文字系列の後に表示されるテキストを削除したいと思います。しかし、既知の一連の文字の前後にどのくらいの文字が表示されるのかわかりません。また、前後のテキストにピリオドやダッシュが複数含まれているかどうかわかりません。次の例が役に立ちます。
ビッグバン理論.S01E01.xxxxxxxxxxxx.mp4
各ファイルには常にSxxExx形式の文字列が含まれていることがわかります。ここで x は常に数値です。しかし、数字がどうなるかはわかりません。 SxxExx文字列とファイル拡張子を含むファイル名を取得したいが、他のすべてを削除したいと思います。したがって、上記の例では、次のように終了します。
ビッグバン理論S01E01.mp4
bashの組み込み文字列置換コマンドを試してみました。 expr indexコマンドはSxxExx文字列の始点を提供すると考え、次に$ {filename:offset:length}を使用して必要なファイル名の一部のみを抽出できます(拡張子を既に知っているので再利用できます)。抽出してください)。ただし、OS X バージョンの expr には索引付け機能が含まれていないようです。以前は、BasicとLotusScriptでのみスクリプトを作成していました。このような環境では、「Like」、「Instr」、「Mid」などのコマンドを使用するのは非常に簡単です。しかし、bashではそれを見つけることはできません。正規表現を使用してファイル名の「SxxExx」サブストリングを検索する方法を見つけるために数時間インターネット検索を行いましたが、私は知りませんでした。スマートなUNIXスクリプトが私を助けてくれることを願っています!
答え1
この試み:
newname=`echo "$filename" | sed -e 's/\(S[0-9][0-9]E[0-9][0-9]\).*\.mp4/\1.mp4/'`
正規表現は次のとおりです。
- グループの開始( \( )
- SXXXEXXと一致します。ここで、X は 0 ~ 9 の数字です。
- ターミナルグループ(\))
- すべての文字と一致します(改行を除く)。
- 明示的な文字列(.mp4)と一致
代替式では:
- 最初のグループ(\ 1)で一致する文字列に置き換えます。
- 明示的な文字列(.mp4)に置き換える
答え2
ファイル名のリストとfile-list
ファイル内のパスがあるとし、次のことを試してください。
while IFS= read -r path; do
newpath=$(printf '%s\n' "$path" |
sed 's/\(.*S[0-9]*E[0-9]*\.\).*\.\([^.]*\)$/\1\2/')
echo mv -- "$path" "$newpath"
done <file-list
使用された正規表現の意味とsed
入力例との比較"The.Big.Bang.Theory.S01E01.xxxxxxxxxxx.mp4"
\( start of group 1
.* The.Big.Bang.Theory. any sequence of characters
S[0-9]* S01 a capital S followed by 0 or more digits
E[0-9]* E01 a capital E followed by 0 or more digits
\. . a dot
\) end of group 1
.* xxxxxxxxxxx any sequence of characters
\. . a dot
\( start of group 2
[^.]* mp4 a sequence of 0 or more non-dot characters
\) end of group 2
$ end of line
出力では、文字列は\1\2
「output group1の後にgroup2(したがって削除されますxxxxxxxxxxx.
)」を意味します。
満足のいくものを削除してくださいecho
。