파일 이름에서 발견된 패턴에만 의존하여 파일 이름과 파일 이름의 내용을 바꿉니다.

파일 이름에서 발견된 패턴에만 의존하여 파일 이름과 파일 이름의 내용을 바꿉니다.

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'

관련 정보