파일에서 특정 작업을 수행하려고 하는데 1에 인덱스를 정의하고 한 줄씩 작업을 수행하여 파일 줄의 내용을 삭제하려고 하는데 sed -i -e "{a}d"
문제는 줄 1만 하나씩 다운로드하는 것 같습니다. 예를 들어, 파일에
1
2
3
4
5
결과는 2 3 5이므로 1과 4만 다운로드됩니다. 내가 뭘 잘못했나요?
#!/usr/bin/bash
a=0
filename="$1"
while read -r line; do
echo $a
name="$line"
Operation
sed -i -e "${a}d" $1
let a+=1
done < "$filename"
댓글 중에서: 내가 하고 싶은 일은 다음과 같습니다.
- 현재 줄을 에코합니다.
- 파일에 대한 작업 수행(이 경우 wget)
- 방금 다운로드한 라인을 삭제하세요.
- 현재 행 추가
- 더 이상 줄이 없을 때까지
답변1
선택한 프로그램이 올바르지 않습니다.
가정된 값은 a
다음에서 시작됩니다 1
.a=1
filename
스크립트가 online 을 읽으면 done<"$filename"
파일의 내용(해당 시점의 내용)을 읽습니다. 그런 다음 동일한 파일을 수정합니다.제자리에행(첫 번째 행이라고 가정)을 삭제하면 다음 읽기에서는 두 번째 원래 행(현재 파일의 첫 번째 행)을 사용하지만 현재 파일(현재 세 번째 행)에서 행 인덱스 2를 삭제합니다. 기타 등등
어떤 일이 발생하는지 확인하려면 다음 스크립트를 실행하세요.
#!/usr/bin/bash
a=1
filename=infile
seq 5 >"$filename"
while read -r line; do
echo "Read line $line for index $a"
echo "Will remove line $(sed "${a}!d" "$filename")"
sed -ie "${a}d" "$filename"
echo;echo next
let a+=1
done < "$filename"
이렇게 하면 됩니다:
$ ./script
Read line 1 for index 1
Will remove line 1
next
Read line 2 for index 2
Will remove line 3
next
Read line 3 for index 3
Will remove line 5
next
Read line 4 for index 4
Will remove line
next
Read line 5 for index 5
Will remove line
next
보시다시피 1, 3, 5행이 삭제되었습니다.
올바른 접근 방식: 둘 중 하나
- 끝부터 시작하다
- 첨부 파일에 색인 저장
- 또는 파일이 빌 때까지 파일의 첫 번째 줄에 대해서만 프로세스를 다시 시작합니다.
이미 알고 있는 도구를 사용하여 세 번째 옵션을 구현하세요.
#!/usr/bin/bash
filename=infile
seq 5 >"$filename"
while [[ -s "$filename" ]]; do
name=$(head -n1 "$filename")
echo wget "$name"
sed -i '1d' "$filename"
done
답변2
IMHO, 읽고 있는 파일을 편집하는 것은 위험합니다. 다른 솔루션을 제안해 보겠습니다.
urls.lst
입력 목록을 한 줄씩 읽기()wget
URL- 성공적으로 두 번째 파일(
received.lst
) 에 URL을 추가하면
프로세스가 중단되고 아직 얻지 못한 URL 목록으로 다시 시작하려는 경우 다음 방법으로 목록을 얻을 수 있습니다.
diff --new-line-format="" --unchanged-line-format="" urls.lst received.lst