sedを使用してトラック番号を削除して、複数の音楽ファイルの名前を変更しています。しかし、正規表現の「+」文字を使用するsedの動作は混乱しています。
私がしたいこと:
for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9]+/\-/g'; done
しかし、これは期待どおりに進まなかった。この回避策は次のタスクを実行します。
for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9][0-9]*/\-/g'; done
しかし、sedで「+」を使用すると、どのような問題があるかを知りたいです。どんなアイデアがありますか?
答え1
+
拡張正規表現修飾子です。sed
する基本正規表現基本的に。
sed
式を拡張正規表現として解析するには、.GNUを.GNUsed -E
として使用すると、デフォルトの正規sed
表現も理解できます。+
\+
そしてパターンが*\-[0-9]**
変に見えます。エスケープを必要とせず-
(シェルパターンや正規表現ではない)でglobstar
使用しないと、bash
パターン**
はそれ自体に拡張されます。globstar
有効にすると、最初のファイル名コンポーネント(ここでは数字)に含まれるすべてのパス名bash
*-[0-9]**
に展開されます。-N
N
私はあなたがしたいことが次のようになると思います(正確ではありませんが、ファイル名がどのように見えるかわかりません)。
for name in *-[0-9][0-9]*; do
newname=${name%-*}
printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
# mv "$name" "$newname"
done
これは-NN
、(は数字)を含む現在のディレクトリのN
すべての名前と一致します。ファイル名の最後の項目からすべての内容を削除し、-
ファイル名を変更します(実際の名前の変更はコメントアウトされます)。