파일에서 일련의 줄을 읽은 다음 각 줄을 삭제하는 방법은 무엇입니까?
분명히 다음과 같이 읽을 수 있습니다.
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