filename.ext
次のパターンに基づいてコンテンツの一致パターンを置き換えることができるかどうか疑問に思います。ファイル名それ自体で使用されますsed
(grep
おそらく?)。
たとえば、再作成できるファイルをいくつか紹介します。
cat > '[2022] Diary 2022 (essay, Travels).txt' <<\EOF
TITLE/- Diary 2022 (essay, Travels) -\TITLE
@
sometext...
EOF
cat > '[2022] Diary 2022 (list, Recipes).txt' <<\EOF
TITLE/- Diary 2022 (list, Recipes) -\TITLE
@
sometext...
EOF
cat > '[2022] Diary 2022 (watchlist, Movies-).txt' <<\EOF
TITLE/- Diary 2022 (watchlist, Movies-) -\TITLE
@
sometext...
EOF
cat > '[2022] Diary 2022 (list, Movies+).txt' <<\EOF
TITLE/- Diary 2022 (list, Movies+) -\TITLE
@
sometext...
EOF
私が使用したいマッチングパターンは(人が右から左に読む方法)です。その間のすべて閉じる閉じ括弧そして初めて向かい合った空間。
私はこのパターンが以下に基づいていると言いたいと思います。場所、代わりに言葉または数字またはその他。
フーバプーバ(foob、マッチ).ext
私はこれが正しい正規表現でなければならないと思います>\(.+\s(\w.+)\)
私は状況が次のように見えるようにしたいです。
[2022] Diary 2022 (essay, Travels).txt
>は>にtravels.txt
なり、その内容は>になります。
TITLE/- travels -\TITLE
@
sometext...
[2022] Diary 2022 (watchlist, Movies-).txt
>は>にmovies-.txt
なり、その内容は>になります。
TITLE/- movies- -\TITLE
@
sometext...
[2022] Diary 2022 (list, Movies+).txt
>は>にmovies+.txt
なり、その内容は>になります。
TITLE/- movies+ -\TITLE
@
sometext...
など...
ベストアンサー1
sed
このタイプのファイル名を変更することはできませんmv
。
bash
バージョンがある場合は、mapfile
名前の変更と変更が簡単です。
モードファイル
#!/bin/bash
set -o noclobber
for filename; do
if [[ $filename =~ ^'['[0-9]+']'[[:space:]]+(.*[[:space:]]([^[:space:]]+)')')'.txt'$ ]]; then
old='TITLE/- '${BASH_REMATCH[1]}' -\TITLE'
new='TITLE/- '${BASH_REMATCH[2]}' -\TITLE'
out=${BASH_REMATCH[2]}.txt
mapfile -d '' data <"$filename"
printf '%s' "${data//"$old"/"$new"}" >"$out"
# rm "$filename"
fi
done
$ chmod +x modfile
$ ./modfile *.txt