ファイル名に含まれる重複部分文字列を削除してファイル名を変更する

ファイル名に含まれる重複部分文字列を削除してファイル名を変更する

次のパターンを使用して複数のファイルの名前を変更する必要があります。

sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json

到着


sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json

run-01_各ファイル名には、4つの可能性(またはrun-02_、、、run-03_run-04のいずれかの種類のサブストリングのみが含まれています。

部分文字列は、指定されたrun-0[1-4]_ ファイルでランダムに複数回繰り返すことができます。

私は心を失い、私が見つけることができる最も近いものスタックオーバーフローに関するこの質問。しかし、文字列操作に関する私の限られた知識に基づいて、より多くの助けが欲しい!

答え1

またはパール:

$ f=sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json
$ g=$(perl -pe 's/(_run-0[1-4])\1+/$1/' <<< "$f")
$ echo "$g"
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json

Perlスタイルのrename(1)プログラムを使用してください:

$ touch "$f"
$ ls sub*json
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json
$ rename 's/(_run-0[1-4])\1+/$1/' sub*json
$ ls sub*json
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json

答え2

使用パラメータ拡張:

for i in *.json; do
  a="${i##*_run}"
  b="${i%%_run*}"
  n="$b""_run$a"
  # mv -- "$i" "$n"
  printf "%s" "$n"
done
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json

その後、名前を変更します。

mv -- "$i" "$n"

注:削除/移動操作を実行するときは、ファイルをバックアップしてください。

答え3

単純な処理よりも状況が複雑になると、rename基本的に同じパターンで短いスクリプトを作成する傾向があります。

for file in *.json
do
   changedname="$(echo "$file" | sed 's/regex/replacement/flags')"
   mv -- "$file" "$changedname"
done

あなたの場合、文字列を見つけて空のrun-0[1-4]_文字列「」に置き換えると、フラグにはg「行の終わりに達するまでこれを複数回実行」が含まれます。

sed 's/run-0[1-4]_//g'

それがあなたの目標です。

最初に現れる場所を削除するだけでなければ難しくありません!

sed -e 's/\(run-0[1-4]_.*\)run-0[1-4]_/\1/g'

関連情報