2012-05-25 3 views
0

sed를 통해 일반적인 찾기/바꾸기보다 약간 더 복잡한 항목에 대한 bash 스크립트를 작성하려고합니다. 나는 bash Cookbook이라는 책을 가지고 있는데, 나는 그 책에서 영감을 얻으려고 애썼지 만 나는별로 멀지 않았다.한 줄에서 복사하고 다른 줄을 복사로 대체하는 Bash 스크립트

기본적으로 maven pom.xml 파일의 버전 번호를 자동으로 업데이트하는 스크립트를 작성하려고합니다. 내가 대신이 파일을 읽기 싶습니다 (새 버전 번호 1.0.1) 스크립트를 실행 한 후

<!-- TEMPLATE:BEGIN 
    <version>@@[email protected]@</version> 
--> 
    <version>1.0.0</version> 
<!-- TEMPLATE:END --> 

: 그래서

<!-- TEMPLATE:BEGIN 
    <version>@@[email protected]@</version> 
--> 
    <version>1.0.1</version> 
<!-- TEMPLATE:END --> 

여기에 내가보고하고있는 일반 설정입니다 이것은 실제 릴리스 pom 파일에있을 것이며 1.0.0은 현재 버전입니다 (그리고 1.0.1 또는 다른 것으로 대체하려고합니다). 분명히 버전 번호가 바뀌어 찾기/바꾸기를 할 수있는 좋은 방법이 아닙니다. (찾기를 원하는 것이 변수이기 때문에) 나는 삭제

  • 전 라인에 업데이트 된 버전의 라인을 쓰기 현재 버전 라인을

    1. 실제 버전 번호
    2. 와 @@ VERSION을 @@ 대체 할 수있는 bash는 스크립트를 쓸 수 바라고 템플레이트 : END (? 파일에 @@ @@ VERSION을 유지하면서이 - 아마도 다시 다음, 교체하고, 임시 파일에서 템플릿을 작성하여이 작업을 수행 할)

    내가 할 일의 종류의 수 이 중 일부는 새 파일에 쓰고 repl acement) 개미 스크립트 라
    <replace file="pom.xml">
    <replacefilter token="@@[email protected]@" value="${version}"/>
    </replace>

    를 사용하지만 무엇에 가장 좋은 방법은 모르겠습니다.) 이전 버전 또는 b.로 줄을 삭제) 올바른 위치에 새로운 라인을 복사하도록 지시 아르. 누구든지이 작업을 수행하거나 조언을 구하는 방법을 알고 있습니까? 새 버전 번호를 가정

  • +0

    당신이 원하는하고 출력은 무엇을보고 있습니까? 귀하의 설명은 다소 모호합니다. –

    +0

    (a) VCS를 사용하여이 (b) XSL (c) 수익 – sehe

    +0

    을 명확히하기 위해 수정하십시오. – matt5784

    답변

    3

    쉘 변수 $VERSION에, 당신은 사용할 수있을 것입니다 :이 @@[email protected]@와 템플릿 버전 라인을 무시

    sed -e '/<!-- TEMPLATE:BEGIN/,/<!-- TEMPLATE:END -->/{ 
         s/<version>[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*<\/version>/<version>'$VERSION'<\/version>/ 
         }' 
    

    참고 있지만 세 부분으로 버전과 일치 TEMPLATE : BEGIN 및 TEMPLATE : END를 포함하는 줄 사이에 나타나는 숫자. 다른 모든 줄 (<version>...</version> 요소가 포함 된 다른 줄 포함) 만 남겨 둡니다.

    파일을 덮어 쓰는 방법을 결정할 수 있습니다 (아마도 sed은 GNU에서 제공되며, 요청시 자동으로 -i 옵션을 사용합니다). 또한 더 강력한 정규 표현식 표기법을 사용하여 더 조밀 한 성냥에. 그러나 대부분의 버전은 변경없이 sed에서 작동합니다.

    1

    설명 된 단계 (1-3)는 댓글 내에 정의 된 템플릿 기반 규칙에 따라 대체 작업을 실제로 수행하지 않는 것처럼 읽습니다.이와 같이

    , 여기 당신이 설명 된대로 자세하게 동작 몇 가지 코드 :

    #!/bin/bash 
    
    file=$1 
    newversion=$2 
    
    sed -i $file -e "s|<version>\([^@]*\)</version>|<version>$newversion</version>|" 
    

    실행이 :

    chmod +x yourscript.sh 
    ./yourscript.sh filetoupdate.xml 1.0.1 
    
    +0

    TEMPLATE : END 뒤에 나타나는 ... 태그에 무슨 일이 생기나요? END –

    0
    use 5.010; 
    use strictures; 
    use Perl::Version qw(); 
    use XML::LibXML qw(); 
    
    my $dom = XML::LibXML->load_xml(location => 'pox.xml'); 
    
    for my $node ($dom->findnodes('//version')) { 
        my $version = Perl::Version->new($node->textContent); 
        $version->inc_subversion; 
        $version->stringify; 
        $node->removeChildNodes; 
        $node->appendText($version); 
    }; 
    
    say $dom->toString; 
    
    +1

    TEMPLATE : END 뒤에 나타나는 ... 태그에 어떤 영향을 주나요? –

    +0

    수정됩니다. – daxim

    관련 문제