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'