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
答え2
そしてzsh
:
rename_and_edit() {
{
printf 'TITLE/- %s -\\TITLE\n' $2:r &&
tail -n+2
} < $1 > $2 &&
rm -f -- $1
}
autoload -Uz zmv
zmv -P rename_and_edit '* (*)\)(.txt)' '$1:l$2'
最初の行に含まれている内容に関係なく、ファイルの最初の行を新しいヘッダーに置き換えます。表示される場所に関係なく、以前のタイトルをすべて新しいタイトルに置き換えるには、次の手順を実行します。
zmodload zsh/mapfile
rename_and_edit() {
local oldtitle="TITLE/- $1:r -\\TITLE" \
newtitle="TITLE/- $2:r -\\TITLE"
print -rn -- ${mapfile[$1]//$oldtitle/$newtitle} > $2 &&
rm -f -- $1
}
autoload -Uz zmv
zmv -P rename_and_edit '* (*)\)(.txt)' '$1:l$2'
または:
zmodload zsh/mapfile
rename_and_edit() {
3=( 'TITLE/- '$^@:r' -\TITLE' )
print -rn -- ${mapfile[$1]//$3/$4} > $2 &&
rm -f -- $1
}
autoload -Uz zmv
zmv -P rename_and_edit '* (*)\)(.txt)' '$1:l$2'