ファイル名で見つかったパターンにのみ依存して、ファイル名とファイル名の内容を変更します。

ファイル名で見つかったパターンにのみ依存して、ファイル名とファイル名の内容を変更します。

filename.ext次のパターンに基づいてコンテンツの一致パターンを置き換えることができるかどうか疑問に思います。ファイル名それ自体で使用されますsedgrepおそらく?)。

たとえば、再作成できるファイルをいくつか紹介します。

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'

関連情報