sed
루프에서 .vtt 텍스트 파일 집합의 요청/헤더에 텍스트를 추가하려고 합니다. 텍스트를 대체하지 않고 텍스트만 추가합니다.
텍스트에 줄 바꿈을 추가해야 합니다.
텍스트는 다음과 같아야 합니다.
WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
이것이 내가 시도하는 것입니다:
for file in *.vtt ; do
sed -i '' 'WEBVTT/nKind: captions/nLanguage: eng/nFile Creation Date: 2023-08' "$file"
done
나에게 오류가 발생합니다 :
sed: 1: 'WEBVTT/nKind: captions/ ...': invalid command code W
이유는 모르겠습니다. 큰따옴표/작은따옴표를 전환해 보았지만 작동하지 않았습니다.
답변1
다음 명령을 사용하는 것이 더 쉽고 이식성이 뛰어납니다 perl
.
perl -0777 -ni -e 'print qq(WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
$_)' -- *.vtt
sed
스크립트는 대체, 분기 또는 삽입 과 같은 단일 문자인 [<address>[,<address>]] <command>
일련 의 문자로 구성됩니다.<command>
s
b
i
여기서 스크립트의 공백이 아닌 첫 번째 문자는 입니다 W
. sed
주문하는 사람이 많지 않아요 W
. 당신의 것은 그렇지 않지만, GNU와 같이 하는 것에서는 sed
당신이 원하는 것을 하지 않습니다.
여기에서는 파일 시작 부분에 일부 텍스트를 삽입하려는 것 같습니다. 따라서 주소 i
sed
로 명령을 사용할 수 있습니다 1
. 즉, 첫 번째 줄에서만 실행됩니다(그러나 파일이 비어 있으면(줄 없음) 전혀 실행되지 않습니다 1
).
sed -i '' -e '1 i\
Kind: captions\
Language: eng\
File Creation Date: 2023-08' -- *.vtt
sed
이것은 당신이 FreeBSD 구현을 사용하고 있는 것으로 가정합니다.
GNU 구현의 경우 sed
다음과 같아야 합니다.
sed -si -e '1 i\
Kind: captions\
Language: eng\
File Creation Date: 2023-08' -- *.vtt
여기에서는 백업 접미사(여기서는 비어 있음)를 -i
옵션 에 추가해야 하며 -s
각 파일 사이에서 줄 번호를 재설정해야 합니다.
GNU를 사용하여 sed
파일에 텍스트를 삽입하려면 header
다음을 수행할 수 있습니다.
sed -si -e '0 r header' -- *.vtt
(주소 0
는 GNU 확장이며 주소 범위 및 명령에서만 유효합니다 . 여전히 빈 파일 앞에 추가되지 r
않습니다 .)header
답변2
문서에 추가하고 싶은 내용은 언제든지 여기에 작성할 수 있습니다.
#!/usr/bin/env bash
tmp=$(mktemp) || exit
trap 'rm -f -- "$tmp"; exit' EXIT
shopt -s nullglob
for file in *.vtt ; do
cat -- - "$file" <<- 'EOF' > "$tmp" &&
WEBVTT
Kind: captions
Language: eng
File Creation Date: 2023-08
EOF
cat -- "$tmp" > "$file"
done
sed -i
임시 파일은 뒤에서 사용되며 위 내용을 통해 명확해졌습니다. 문서의 선행 공백은 다음과 같아야 합니다.탭, 다른 유형의 공백이 아닌.
답변3
awk를 사용하는 것이 더 쉬울 수도 있습니다. 앞에 추가된 텍스트 줄을 파일(addit.txt라고 부름)에 넣고 다음 루프를 사용합니다.
$ for file in *.vtt ; do awk -i inplace 'NR==1{system ("cat addit.txt")}1' "$file"; done
이렇게 하면 각 .vtt 파일 상단에 짧은 텍스트가 추가됩니다.