初心者の質問:ZSHスクリプトの正規表現

初心者の質問:ZSHスクリプトの正規表現

私の問題は簡単だと思います。固定プレフィックスと古いファイル名の一部である数字(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.).*と一致し、可能な限り最小の()のみを残すためです。 (それぞれ)。foo123foo124<->34[0-9][0-9]

PCREを使用している場合は、次のような貪欲ではない一致演算子を使用できます。

set -o rematchpcre
[[ $file =~ '^.*?(\d+)\.pdf\z' ]]
number=$match[1]

.*ただし、正規表現を最初に固定しないと必要ありません(上記では^暗黙expr的に最初に固定されています)。

[[ $file =~ '(\d+)\.pdf$' ]]

(PCRE以降の$EREのデフォルト値)。\zset -o rematchpcre

または、ここで次のことを実行できます。

zmv '*<->.pdf' 'Newfile ${(M)${f:r}%%<->}'

${f:r}延長する場所ルート名(拡張子の削除)${(M)param%%pattern}一致する引数の最も長い尾まで拡張しますpattern<->ここでは制限なしにすべてのASCII 10進数シーケンスと一致します<x-y>)。

ファイル名からすべての数字を抽出するには(たとえば、または次のようfoo-123-bar.pdfに名前を変更するなど)Newfile 123foo1bar2.pdfNewfile 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$')

その番号が見つからない場合は失敗した終了ステータスを返し、その番号が見つからない場合000...000

このプレフィックスは、拡張が演算子の場合に演算子として扱われる設計バグをx解決するためのものです。expr$fileexpr

これはmatch標準expr演算子ではなく、標準演算子はこの:演算子です。

繰り返しますが、70年代には非常に破損して制限されたユーティリティであり、特に非常に強力なテキスト抽出と書式設定機能が組み込まれているexprため、今日でも引き続き使用する理由はありません。zsh

おすすめ記事