次のパターンを使用して複数のファイルの名前を変更する必要があります。
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'