2017-10-04 1 views
0

STARTEND 마커 사이의 각 텍스트 블록을 별도의 파일로 추출하고 싶습니다. Sed가 선호하는 도구이지만 grep과 awk도 괜찮습니다. 두 마커 사이의 각 텍스트 블록을 sed 파일로 작성하십시오

주어진 다음의 파일 내용 :

내용으로 각각 두 개의 파일을 생성해야합니다 나오지
abc 
START 
    def 
END 
ghi 
START 
    jkl 
END 
mno 

:

START 
    def 
END 

START 
    jkl 
END 

을 나는 사이의 내용을 얻는 방법을 알고 sed가있는 두 개의 정규 표현식 :

sed -n '/START/,/END/p' 

e 플래그를 제공 할 때 sed에서 쉘 명령을 실행하는 옵션이 있습니다. 이 작업에 활용할 수 있습니까?

답변

2

당신 (GNU이 나오지도)에 대한이 작동하지 않을 수 있습니다 : 시작과 끝 구분 사이의 모든 라인을 수집 나오지

sed '/START/,/END/!d' file | csplit -z - '/END/1' '{*}' 

를 사용하여, 다음 라인의 각 그룹에 대해 별도의 파일을 만들 csplit을 적용합니다. 그래서없이

을 potong

+0

++ 멋진 코드입니다. 아주 좋은 코드를 보내 주셔서 감사합니다. csplit에 대해 감사드립니다. – RavinderSingh13

+2

@ RavinderSingh13 csplit은 분할에 변형입니다. 파일과 일부 패턴 (필요한 경우 오프셋이 있음)이 필요합니다. info/man csplit 또는 csplit -h를 참조하십시오. – potong

+0

근사한 접근법이지만이 예제에서 3 개의 파일을 생성하는 이유는 무엇입니까? 마지막 하나는 비어 있으며 처음 두 개는 예상대로입니다. –

1

AWK는 여기에 저장하기 :

awk '/END/{flag="";print > i"_file";close(i"_file");next} /START/{flag=1;print > ++i"_file";next} flag{print > i"_file"}' Input_file 

출력이 1_file라는 이름의이 개 파일을 생성하고 다음과 같은 내용으로 2_file됩니다.

cat 1_file 
START 
    def 
END 

cat 2_file 
START 
    jkl 
END 

해결책이 아닌 하나의 라이너 형태를 추가하는 것입니다.

awk ' 
/END/{ 
    flag=""; 
    print > i"_file"; 
    close(i"_file"); 
    next 
} 
/START/{ 
    flag=1; 
    print > ++i"_file"; 
    next 
} 
flag{ 
    print > i"_file" 
} 
' Input_file 
1

매우 흥미로운 csplit

감사 나오지

csplit -z --suppress-matched infile %START%-1 /END/1 {*} 

-m = 작동하지 않습니다 --suppress 일치.

맨 페이지 fr tell -m하지만 잘못되었습니다.

+0

예제와 함께 작동하지만 'START'가 첫 번째 줄에 있으면 해당 줄 번호가 범위를 벗어 났음을 알립니다 –

+1

그런 식으로 사용할 수 있습니다 (echo; cat infile) | csplit - -z -s - 억제 일치 % START % -1/END/1 {*} –

관련 문제