sed를 사용하여 find의 파일 스트림에서 텍스트를 차단하는 방법

sed를 사용하여 find의 파일 스트림에서 텍스트를 차단하는 방법

많은 파일이 포함된 디렉토리가 있습니다 *.org. 정리된 모든 파일 중에서 텍스트를 선택하고 싶습니다. * Learnings내용에 제목이 있습니다. * Learnings파일의 처음부터 끝까지 선택하고 싶습니다 .

내 현재 시도는

find ~/org/journal -name "*.org" -type f | xargs sed -n -e '/\*\ Learnings/,$p'

그러나 이는 연결된 스트림만 출력합니다.

* Learnings예상되는 출력은 조회에서 반환된 각 파일의 헤더 다음에 나오는 콘텐츠 스트림입니다.

또한 솔루션확실히사용해야 한다sed

답변1

GNU 구현에서는 aka 옵션을 사용하여 각 파일을 개별적으로 처리 sed할 수 있습니다 .-s--separate

find . -name '*.org' -type f -exec sed -s '/\* Learnings/,$!d' {} +

그리고 awk:

find . -name '*.org' -type f -exec awk '
  FNR == 1 {found = 0}; /\* Learnings/ {found = 1}; found' {} +

답변2

Perl에서는 다음을 사용할 수 있습니다.에브이는 파일의 모든 끝에서 적용됩니다.

find . -type f -name '*.org' -exec perl -ne 'print if /\* Learnings/ .. eof' {} +

사용된 +형식 -exec은 다음과 유사합니다 xargs. 발견된 모든 파일을 추가하여 지정된 명령에 대한 인수를 작성합니다.

답변3

이것이 일종의 숙제가 아니라면 ;-), 다음을 사용할 수 있습니다.여기GNU 또는 *BSD grep을 사용하십시오.

grep -hrFA 10000 '* Learnings' directory

파일이 10,000줄을 초과하는 경우 10,000을 더 큰 값으로 바꾸세요.

답변4

Gnu sed에서 확인해보세요.

find ~/org/journal -iname "*.org" -type f -exec sed -nE '/\*\sLearnings/,$ p' '{}' +

실제로 편집하고 저장하면 소스는 확장자가 .o인 파일에 있습니다.

find ~/org/journal -iname "*.org" -type f -exec sed -i.o -nE '/\*\sLearnings/,$ p' '{}' +

관련 정보