sed bash 변수는 파일에서 한 줄을 삭제합니다.

sed bash 변수는 파일에서 한 줄을 삭제합니다.

파일에서 특정 작업을 수행하려고 하는데 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입력 목록을 한 줄씩 읽기()
  • wgetURL
  • 성공적으로 두 번째 파일( received.lst) 에 URL을 추가하면

프로세스가 중단되고 아직 얻지 못한 URL 목록으로 다시 시작하려는 경우 다음 방법으로 목록을 얻을 수 있습니다.

diff --new-line-format="" --unchanged-line-format=""  urls.lst received.lst

관련 정보