4

括弧内に接頭辞コードを含むファイルがたくさんあります。次のように、これらのプレフィックスをサフィックスに変換したいと思います。

Finance-(4BF)-001.doc   --> Finance-001-4BF.doc
Corporate-(K04)-001.doc --> Corporate-001-K04.doc

以前、Windows マシンでこれを行うための非常に単純な VBScript を作成しましたが、今は Linux でこれを行う必要があります。面倒な検索の後、正規表現をファイル名に適用し、正規表現の一致を使用して名前を変更するシンプルでエレガントな方法を見つけることができません。

これまでのところ、私はこれを持っています:

#!/bin/bash
for i in *.doc
do
    x=${i//[\(\)]/}
    echo "$i renames to: $x"
done

これの出力は次のとおりです。

Corporate-(K04)-001.doc renames to: Corporate-K04-001.doc
Finance-(4BF)-001.doc renames to: Finance-4BF-001.doc

上記の正規表現は、ファイル名から角かっこ () を削除しているだけだと思いますが、それらの内容を一致させ (例: \((\w)\))、その一致を名前変更コマンドで使用する方法 (例: ) が必ずあるはず$1です。

また、Linux初心者なので、何x=${...}をしているのかわかりません。名前がわからないので、Googleで検索することもできません。文字列に正規表現を適用していると思いますiが、その場合$1$2などから一致を抽出できないのはなぜですか?

ありがとう!

4

4 に答える 4

3

この構成${...}は「パラメーター展開」と呼ばれ、Bash のマニュアルに記載されています。

置換機能は非常に基本的なものであり、後方参照 ( ) をサポートしていません$1。代わりに使用できますsed

x=$(sed -E 's/\(([[:alnum:]]+)\)-([[:alnum:]]+)/\2-\1/' <<< "$i")

[[:alnum:]]は他の言語と同じです\wが、POSIX 正規表現には後者がないことに注意してください。詳細man re_formatについては、を参照してください。

于 2012-09-06T19:24:24.483 に答える
3

${parameter/pattern/string}Bashパラメーター展開の構文は正規表現ではありません。それはグロブです(と特別#%扱われます)。

Bash には、キャプチャされたグループを配列に入れる正規表現を使用する[[ =~ ]] 条件式があります。${BASH_REMATCH[@]}

#!/bin/bash
for i in *.doc; do
    if [[ $i =~ ^(.*)-\((.*)\)-([^.]*)(..*)?$ ]]; then
        x="${BASH_REMATCH[1]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
        echo "$i renames to: $x"
    fi
done
于 2012-09-06T19:28:52.600 に答える
3

実行しているシステムによっては、実際には perl スクリプトであり、正規表現を使用できる名前変更ユーティリティがあるはずです。新しいUbuntuバージョンにはそのようなコマンドがあることを私は知っていますが、私のSlackwareディストリビューションにはありません。

ただし、次のように試して使用することもできます。

rename 's/-\((.{3})\)-(.{3})/-$2-$1/' *.doc

それ以外の場合は、sed または awk に依存する必要があります。

于 2012-09-06T19:33:04.890 に答える
0

これを試して:

#!/bin/bash
for i in *.doc; do
  x=${i#*(}
  x=${x%)*}
  echo "$i renames to: ${i%%-*}-$x-${i##*-}"
done
于 2012-09-06T19:34:19.453 に答える