2013-11-21 9 views
1

파일에서 특정 문자열을 검색하고 특정 문자열에 다시 도달 할 때까지 파일의 모든 줄을 제거해야합니다. 기본적으로 두 특정 문자열 사이의 모든 줄을 제거해야합니다.
예를 들어
쉘 스크립트를 사용하여 txt 파일의 특정 줄을 제거해야합니다.

<start /myhome > 
some entries 
some entries 
<end> 
<start ~ "/myhome[^/]+" > 
some entries 
some entries 
<end> 
<start /newhome > 
some entries 
some entries 
another entry 
different string 
<end> 
<start ~ "/myhome[^/]+" > 
some entries 
some entries 
<end> 

예상 출력은 다음과 같아야합니다

<start /myhome > 
some entries 
some entries 
<end> 
<start /newhome > 
some entries 
some entries 
another entry 
different string 
<end> 
+2

를 내장 매크로를 사용하려는 경우 글쎄, 당신은 무엇을 가지고 시도한거야? – jmstoker

+0

질문이 있으십니까? – Kenosis

답변

3
perl -ne 'print if !(/<start.*?myhome\[.*?>/ .. /<end>/);' < file.txt 

편집 : 당신은 ...

#!/bin/sh                  

hide_from_to() { 
    start=$1 
    end=$2 
    unset hide 

    while read line 
    do 
    if test "$line" = "$start" 
    then 
     hide=1 
    fi 
    if test -z "$hide" 
    then 
     echo $line 
    fi 
    if test "$line" = "$end" 
    then 
     unset hide 
    fi 
    done 
} 

hide_from_to '<start ~ "/myhome[^/]+" >' '<end>' < a.txt 
+0

감사합니다. @Amadan. 쉘 스크립팅을 사용하여 동일한 작업을 수행하는 방법은 무엇입니까? – user2589079

+1

그건 * 쉘 스크립팅입니다. 모든 쉘 스크립팅은 다양한 실행 파일을 호출하여 서로 결합하는 다양한 작은 작업을 수행합니다. '/ bin/cat'과'/ usr/bin/perl' 사이에는 차이가 없습니다. 단, 후자는 좀 더 유연합니다. – Amadan

+0

하지만 상자에 perl이 설치되어 있어야합니다. 내가 틀렸다면 나를 바로 잡아라. 유닉스 박스의 대부분은 perl이 설치되어 있다고 확신하지만 예외적 인 경우가되고 싶지 않습니다. 답장을 보내 주셔서 감사합니다. – user2589079