지정된 문자열이 있는 두 줄 사이의 grep

지정된 문자열이 있는 두 줄 사이의 grep

이 간단한 플랫폼 파일(file.txt)이 있습니다.

a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo

두 가지 형식의 test1과 test2 사이의 모든 줄이 필요합니다. 첫 번째 줄은 두 개의 새 파일을 만듭니다.

새 파일 1.txt:

test1
abc
cvb
bnm
test2

새 파일 2.txt

test1
def
ijk
xyz
test2

두 번째 양식은 단순히 새 파일을 생성합니다. 예를 들면 다음과 같습니다.

새 파일.txt

test1abccvbbnmtest2
test1abccvbbnmtest2

추천 메뉴가 무엇인가요?

두 번째 형태의 경우. 나는 이것을 사용했다

sed -n '/test1/,/test2/p' file.txt > newfile.txt

하지만 그것은 나에게 이런 결과를 준다

test1abccvbbnmtest2test1abccvbbnmtest2

다음과 같은 반환 라인이 필요합니다.

test1abccvbbnmtest2
test1abccvbbnmtest2

답변1

첫 번째 경우에 대한 awk oneliner :

awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt

이는 다음과 같이 말합니다.

  • 발견 되면 test1파일 번호를 늘리고 출력을 시작합니다(예: transfer on)
  • 켜져 있으면 파일 이름 "newfileFILE.txt"에 줄을 인쇄합니다. 여기서 FILE은 파일 번호입니다.
  • 발견 되면 test2출력을 종료합니다(예: 닫기).

newfile.txt그런 다음 Shell Oneliner를 사용하여 이 두 파일을 다음으로 변환할 수 있습니다.

for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt

이는 각 파일에 대해 모든 줄 바꿈이 제거됨을 의미합니다.

답변2

두 번째 양식의 경우:

sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
  • sed -n '/test1/,/test2/p' file.txt --> test1과 test2 사이의 텍스트 캡처
  • xargs > newfile.txt --> xargs의 목적은 다를 수 있지만 실제로 텍스트를 "줄"로 변환합니다.
  • sed 's/test2/&\n/g' newfile.txt --> "test2" 패턴 뒤에 개행 문자 추가
  • sed -e 's/^[ \t]*//' --> 각 줄의 시작 부분에서 공백을 제거합니다.

관련 정보