파일에서 특정 줄을 삭제하고 싶습니다. 20-37행과 45행이 있다고 가정해 보겠습니다. 이 줄의 내용을 지정하지 않고 어떻게 이를 수행할 수 있습니까?
답변1
를 사용하면 sed
다음과 같습니다.
sed '20,37d; 45d' < input.txt > output.txt
이 작업을 현장에서 수행하려면 다음을 수행하십시오.
sed --in-place '20,37d; 45d' file.txt
답변2
파일이 메모리에 맞으면 를 사용할 수도 있습니다 ed
.
이 명령은 위의 명령과 매우 유사하며 sed
그 중 하나 입니다.중요한 차이점: 삭제할 행 번호/범위 목록을 내림차순(가장 높은 행 번호/범위부터 가장 낮은 행 번호/범위까지)으로 전달해야 합니다. 그 이유는 줄 삭제/삽입/분할/연결을 사용할 때 ed
각 하위 명령 후에 텍스트 버퍼가 업데이트되므로 일부 줄을 삭제하면 다음 줄의 나머지 부분이 더 이상 동일한 버퍼 위치에 있지 않기 때문입니다. 다음 하위 명령을 실행합니다. 그래서 처음 부터 시작해야 합니다 1 .
제자리에편집하다:
ed -s in_file <<IN
45d
20,37d
w
q
IN
또는
ed -s in_file <<< $'45d\n20,37d\nw\nq\n'
또는
printf '%s\n' 45d 20,37d w q | ed -s in_file
결과 출력을 파일에 쓰는 대신 인쇄하려면 w
rite를 rint로 바꾸십시오. ,p
원본 파일을 그대로 유지하고 다른 파일에 쓰려면 새 파일 이름을 w
rite 하위 명령에 전달할 수 있습니다.
ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN
1 각 선택 후에 새 줄 번호를 계산 하려는 경우가 아니라면 d
이 특정 경우에는 매우 간단합니다(20-37줄 제거, 즉 18줄 이후 45줄이 27줄이 됨). 다음을 실행할 수 있습니다.
ed -s in_file <<IN
20,37d
27d
w
q
IN
그러나 여러 줄 번호/범위를 삭제해야 하는 경우에는 거꾸로 작업하는 것이 좋습니다.
답변3
그냥 메모리로 읽어서 변경하고 다시 쓰면 됩니다. 당신은 다음과 같은 것을 할 수 있습니다
filename = "foo"
f = open(filename, 'r+')
linenums = [1, 3]
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()
테스트에는 5줄 파일을 사용하세요. 감사의 말http://pleac.sourceforge.net/pleac_python/fileaccess.html, "임시 파일 없이 파일 수정" 섹션을 참조하세요. 당신은 또한 볼 수 있습니다https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python
몇 가지 참고사항:
위와 같이 파일을 먼저 쓴 다음 자르는 대신 파일을 먼저 잘라서 쓰는 것이 가능합니다. 그러나 나는 읽기를 허용한 다음 쓰기를 자르는 Python 플래그를 모릅니다. 하지만 문서가 명확하지 않기 때문에 뭔가 빠졌을 수도 있습니다. 이게 생각나네
때로는 Python 문서가 정말 좋지 않습니다. 바라보다 http://docs.python.org/library/functions.html#open
"r+", "w+" 및 "a+" 모드는 업데이트를 위해 파일을 엽니다("w+"는 파일을 자릅니다).
이것이 당신에게 어떤 의미가 있나요? "공개 업데이트"란 정확히 무엇입니까?
Unixy(예: 스트림 편집기)보다 Python에서 이 작업을 수행하는 것이 더 나은지 모르겠습니다. 휴대성이 더 좋을 수도 있지만 sed가 얼마나 휴대성이 좋은지는 모르겠습니다. 나는 고전적인 유닉스 도구보다 낮은 수준의 프로그래밍에 더 익숙하기 때문에 이 글을 씁니다. 원하는 대로 정확하게 수행하면 괜찮지만 (제 생각에는) 일반적으로 그다지 유연하지 않습니다.
이 방법(메모리의 파일 조작)은 메모리를 디스크 공간으로 교환합니다. 최대 수백 Mb의 파일에 대해 몇 Gb의 메모리가 있는 시스템에서 실행되어야 합니다. Python은 문자열을 매우 효율적으로 처리하지 않으므로 C/C++로 전환하면 성능이 약간 향상되고 메모리 사용량이 크게 줄어듭니다.
답변4
Ex 모드에서 Vim을 사용할 수 있습니다:
ex -sc '20,37d|45d|x' file
d
삭제x
저장하고 닫습니다