파일에서 줄을 읽고 삭제

파일에서 줄을 읽고 삭제

파일에서 일련의 줄을 읽은 다음 각 줄을 삭제하는 방법은 무엇입니까?

분명히 다음과 같이 읽을 수 있습니다.

while read -r line; do
echo $line
done < myfile.txt

하지만 이렇게 하면:

while read -r line; do
echo $line
sed '1d' myfile.txt
done < myfile.txt

나는 첫 번째 줄만 얻는다

나는 한 줄을 읽고, 그 줄로 뭔가를 한 다음, 파일의 다음 줄로 이동하기 전에 삭제하는 우아한 방법을 찾고 있습니다.

답변1

sed차라리 한 번만 호출한 다음 각 행 반복에서 호출하는 것이 좋습니다 . 원본 파일을 변경하려면 추가할 수 있습니다.-나(- 제자리에) 옵션 sed.

unset n
while read -r line; do
  echo $line
  : $((n++))
done < myfile.txt
sed "1,$n d" myfile.txt

답변2

넌 할 수있어:

sed -n '$d;w file2' >file1 <<IN
$(cat file1; echo .)
IN

이렇게 하면 file1의 모든 줄을 삭제하면서 file1의 모든 줄을 file2에 안전하게 쓸 수 있습니다. 쉘은 중간 임시 파일을 안전하게 처리합니다. 임시 파일을 생성한 다음 단일 바이트를 쓰기 전에 파일 시스템에서 삭제합니다.

sed파일 설명 자가 해제되면(EOF 또는 종료 시 - 먼저 오는 시점)파일이 전혀 존재하지 않습니다. 일반적인 옵션과 달리 청소 자체 sed -i에 의존하지 않습니다.sed(예기치 않은 중단을 처리하는 경우에는 이런 일이 발생하지 않을 수 있습니다)-i그리고 옵션에서 암시하는 것과 동일한 권한 불일치가 발생하지 않습니다 .

그리고 설명된 것처럼 응용 프로그램이 전역적일 필요는 없습니다. 원본 파일에서 줄을 제거하거나 선택적으로 별도의 출력에 쓸 수 있습니다.

sed -n '$d;/pattern1/w file2
           /pattern2/p' >file1 <<IN
$(cat file1; echo .)
IN

...file1에서 일치하는 줄만 다시 file1로 인쇄하는 방법 과 /pattern2/file1에서 일치하는 줄만 file2에 /pattern1/쓰는 방법을 보여줍니다 w. sed물론 다른 명령도 작동합니다.

그러나 대부분의 쉘에서는 file1에서 NUL 바이트를 상속하지 않는다는 점에 주목할 가치가 있습니다.(이것은 일반적으로 sed직장에서는 문제가 되지 않습니다)- 그런 일이 가능하긴 하지만 zsh.

답변3

파일이 올바르게 처리되면 파일의 모든 줄을 다음 코드 조각으로 바꿀 수 있습니다. 처리가 실패하더라도 삭제하지 말고 필요한 경우 다시 처리할 수 있습니다.

while read; do
  if some_command_worked_correctly; then
    sed -i '1,1 d' file-to-read
  fi
done < file-to-read

관련 정보