グループ識別子間の数字をエスケープする方法

グループ識別子間の数字をエスケープする方法

このユーティリティを使用しています名前を変更する複数のファイルの名前を変更すると、グループ識別子間の数をエスケープする方法がわかりません。これは基本的なものであるに違いありませんが、私はこのような状況を経験したことがなく、直観が正しいエスケープ文字を見つけるのに役立ちません。

ファイル名の数を23次のように変更したいと思います。

rename -n 's/(.*)([0-9]{2})(.*)/$1"23"$3/' *

$ rename -n 's/(.*)([0-9]{2})(.*)/$1"23"$3/' *
rename(Request22Message.json, Request"23"Message.json)
rename(Response22ExpectedMessage.json, Response"23"ExpectedMessage.json)
rename(Response22Message.json, Response"23"Message.json)

この場合、ドットは接続文字として扱うことができます。

$ rename -n 's/(.*)([0-9]{2})(.*)/$1.23.$3/' *
rename(Request22Message.json, Request.23.Message.json)
rename(Response22ExpectedMessage.json, Response.23.ExpectedMessage.json)
rename(Response22Message.json, Response.23.Message.json)

いいえ。

答え1

実際に数字をエスケープする問題ではありません。$123キャプチャグループで参照を明確にする問題です123。この状況のケースはperlre以下の文書にあります。$1 ではなく警告\1

しようとすると

s/(\d+)/\1000/;

言葉であいまいさを取り除くことはできませんが、言葉であいまい\{1}000さを修正することはできます${1}000

例えば

rename -n 's/(.*)([0-9]{2})(.*)/${1}23$3/' *.json

または(対称のため)

rename -n 's/(.*)([0-9]{2})(.*)/${1}23${3}/' *.json

あなたできる文字列連結演算子を使用します.が、これには実行フラグを追加する必要があります。

rename -n 's/(.*)([0-9]{2})(.*)/$1."23".$3/e' *.json

関連情報