sed - *有効、+無効ですか?

sed - *有効、+無効ですか?

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]**に展開されます。-NN

私はあなたがしたいことが次のようになると思います(正確ではありませんが、ファイル名がどのように見えるかわかりません)。

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すべての名前と一致します。ファイル名の最後の項目からすべての内容を削除し、-ファイル名を変更します(実際の名前の変更はコメントアウトされます)。

関連情報