私の問題は簡単だと思います。固定プレフィックスと古いファイル名の一部である数字(2桁)を含む新しいファイル名を作成したいと思います。
例:「blableblub23.pdf」ファイルがあり、名前を「Newfile 23」に変更して移動したいと思います。ここで、「Newfile」は固定接頭辞です。
したがって、最初の古いファイル名から数字以外のすべてのエントリを削除する必要があります。これは主な問題です。頑張っています
paperno=expr match "$filename" '.*([0-9][0-9]).*'
filename_new="Newfile $paperno"
私は常に数字なしでfilename_new = "Newfile"を取得しますが、 "Newfile 23"を期待しています。
私のせいは何ですか?
本当にありがとうございます;)
明確にするために編集されました:
ファイル名どこにでも2桁の数字を含むファイル名($ filenameに保存されています)があります。
Test_bla_blub_23_and_more.pdf Test_23.pdf Test_23_bla.pdf
新しいファイル名を作成するために、別の変数$papernoに数字(例:23)を保存したいと思います。
ファイル名に数字が含まれていない場合、またはそれ以上の数字がある場合は、$paperno変数は空またはゼロでなければなりません。数字が複数ある場合は、すべての数字を返すと受け入れられます。つまり:
Test_12_bla_blub_23_and_more.pdf => $paperno = 1223
申し訳ありません。私は初めてシェルスクリプト、zsh、正規表現に触れました。
答え1
zsh
正規表現マッチング(EREとPCRE)のいくつかの基本的なサポートがあり、正規表現以上に拡張されたglob演算子もあります。古い、破損した設計コマンドを使用する必要はありませんexpr
(BREを使用して、基本的な正規表現自体)。
バッチの名前変更ツールもあります。
autoload -Uz zmv
zmv -v '(*[^0-9]|)(<->).pdf' 'Newfile $1'
(*)(<->).pdf
は.*([0-9][0-9])\.pdf
動作しません。foo1234.pdf
たとえば、*
(resp.)は(resp.).*
と一致し、可能な限り最小の()のみを残すためです。 (それぞれ)。foo123
foo12
4
<->
34
[0-9][0-9]
PCREを使用している場合は、次のような貪欲ではない一致演算子を使用できます。
set -o rematchpcre
[[ $file =~ '^.*?(\d+)\.pdf\z' ]]
number=$match[1]
.*
ただし、正規表現を最初に固定しないと必要ありません(上記では^
暗黙expr
的に最初に固定されています)。
[[ $file =~ '(\d+)\.pdf$' ]]
(PCRE以降の$
EREのデフォルト値)。\z
set -o rematchpcre
または、ここで次のことを実行できます。
zmv '*<->.pdf' 'Newfile ${(M)${f:r}%%<->}'
${f:r}
延長する場所ルート名(拡張子の削除)${(M)param%%pattern}
一致する引数の最も長い尾まで拡張しますpattern
(<->
ここでは制限なしにすべてのASCII 10進数シーケンスと一致します<x-y>
)。
ファイル名からすべての数字を抽出するには(たとえば、または次のようfoo-123-bar.pdf
に名前を変更するなど)Newfile 123
foo1bar2.pdf
Newfile 12
zmv -v '*[0-9]*.pdf' 'Newfile ${f//[^0-9]}'
を展開し${f//pattern/replacement}
て$f
すべての項目をpattern
置き換えますreplacement
。ここでは置換を省略するので、10 進数を除くすべての文字を何も置換しません。
.pdf
完全性のために以前に数値リストを抽出するには、expr
次の手順を実行する必要があります。
number=$(expr "x$file" : '.*[^0123456789]\([0123456789]\{1,\}\)\.pdf$')
その番号が見つからない場合は失敗した終了ステータスを返し、その番号が見つからない場合0
は00
...000
このプレフィックスは、拡張が演算子の場合に演算子として扱われる設計バグをx
解決するためのものです。expr
$file
expr
これはmatch
標準expr
演算子ではなく、標準演算子はこの:
演算子です。
繰り返しますが、70年代には非常に破損して制限されたユーティリティであり、特に非常に強力なテキスト抽出と書式設定機能が組み込まれているexpr
ため、今日でも引き続き使用する理由はありません。zsh
答え2
式の出力文字数が一致していますか? paperno変数を印刷してみましたか?私はそれがあなたに期待される結果を与えるとは思わない
可能な方法は、すべての文字列を削除して「.」に切り捨てて数値を取得することです。良い:
charstostrip=expr match "$filename" '^[a-zA-Z]+$'
modified=${$filename:$charstostrip}
fn_number=${echo $modified | cut -d . -f1}
filename_new="Newfile $fn_number"