예전에 이 포럼을 이용하다가 이제 막 가입했어요! 비슷한 질문을 보았지만 지금까지 아무것도 작동하지 않았습니다(주로 sed를 사용함). 파일에서 별표(*)의 모든 인스턴스를 찾아 빈 줄에 도달할 때까지 별표와 그 뒤의 모든 항목을 삭제하고 싶습니다. 예를 들어:
*252
253
254
255
(blank line here)
또는
*261
265
(blank line here)
각 데이터 블록의 길이는 다양합니다. 그런 다음 출력을 새 파일로 이동하고 싶습니다. 어떤 아이디어가 있나요?
답변1
*
다음 빈 줄이 포함된 줄에서 제거하려면 다음을 사용하세요.
sed '/[*]/,/^$/d' filename
노트:
은
*
정규식 활성 문자이고 리터럴만 일치시키려고 하므로*
이스케이프해야 합니다 . 이는 위에 표시된 대로*
수행할 수 있습니다 .\*
[*]
^
빈 줄을 일치시키려면 시작(으로 표시됨)과 끝(으로 표시됨) 사이에 문자가 없는 줄이 필요합니다$
. 따라서^$
빈 줄과 일치합니다./[*]/,/^$/
*
범위입니다. 빈 줄을 포함하는 줄로 시작 하고 빈 줄로 끝나는 줄 집합과 일치합니다 .d
범위의 모든 줄을 삭제하도록 sed에게 지시합니다.
위의 코드는 표준 출력으로 출력됩니다. 현재 위치에서 파일을 변경하려면 다음을 사용하세요.
sed -i.bak '/[*]/,/^$/d' filename
예
다음 예제 파일을 고려해보세요.
$ cat filename
*252
253
254
255
OR
*261
265
end
그러면 다음이 생성됩니다.
$ sed '/[*]/,/^$/d' filename
OR
end