2011-10-19 1 views
3

쉘 스크립트를 통해 여러 줄을 검색하고 교체하는 방법을 찾고 있습니다. 이것은 내가하려고하는 것입니다 :셸 스크립트 : 여러 줄로 검색하고 바꾸기

source: 
[stuff before] 
<!--WIERD_SPECIAL_COMMENT_BEGIN--> 
    [stuff here, possibly multiple lines. 
<!--WIERD_SPECIAL_COMMENT_END--> 
[stuff after]  

target: 
[stuff before] 
[new content] 
[stuff after] 

요컨대, 주석과 그 사이의 모든 것을 삭제하고 새로운 내용으로 대체하고 싶습니다. 기본적으로 여러 줄에 걸쳐 간단한 sed 명령을 수행하고 가능한 경우 기본 * nix 도구를 사용하여 추가 스크립팅 언어를 사용하지 않습니다.

+0

중첩 된 댓글은 어떻게됩니까? – FailedDev

답변

1

전체 라인을 맞추기 만하면 awk으로이 작업을 수행 할 수 있습니다. 뭔가 같은 : 파일이 너무 잘 에 코멘트, 당신은 유지하거나 제거 할 텍스트로 같은 줄, 그때 , perl을 사용하여 하나의 문자열로 전체 파일을 읽을 것이다 포맷되지 않은 경우

awk -v NEWTEXT=foo 'BEGIN{n=0} /COMMENT_BEGIN/ {n=1} {if (n==0) {print $0}} /COMMENT_END/ {print NEWTEXT; n=0}' < myfile.txt 

, 정규식을 수행하고 해당 문자열을 대체 한 다음 새 문자열을 새 파일에 작성합니다. 이것은 간단하지 않고 작업을 수행하려면 perl 스크립트를 작성해야합니다. 같은 뭔가 :

#!/usr/bin/perl 
$newtext = "foo\nbar"; 
$/ = ''; # no input separator so whole file is read. 
$s = <>; # read whole file from stdin 
$startPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_BEGIN-->'); 
$endPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_END-->'); 
$pattern = $startPattern . '.+' . $endPattern; 
$s =~ s/$pattern/$newtext/sg; 
print $s; 
+0

내 파일은 꽤 똑바로 전송되므로 트릭을해야합니다. 호기심에서 줄을 따라 갈 수 없다면 나에게 도움이되는 기본적인 유닉스 툴이 있는가? 아니면 더 강력한 것을 필요로 하는가? – Reason

+0

'sed '나 다른 기본적인 유닉스 도구로는 이것이 너무 어렵다고 생각합니다. 나는 perl에 예제를 추가했다. 이것은 라인 단위로 작업하지 않을 때 가능한 가장 간단한 해결책이라고 생각한다. –

0

sed이 잘 않습니다. 다음과 같이 간단합니다. 시작 구분 기호 앞에 또는 끝 구분 기호 뒤에 구분 기호 줄에서 내용을 추출해야하는 경우에는 좀 더 복잡해집니다.

sed '/<!--WIERD_SPECIAL_COMMENT_BEGIN-->/,/<!--WIERD_SPECIAL_COMMENT_END-->/d' input >output 

당신이 이것을 제어 할 수 있다면 "이상한"철자를 수정하십시오.

0

다른 해결책은 ...이 한 라이너를 이루어,하지만 난 멀티와 성가시다 또는 AWK을 (나오지도보다 작업을 쉽게 찾을 수 정규 표현식을 사용 할 수 있습니다 라인 일치 및 바꾸기) :

perl -0 -i -pe 's/<!--WIERD_SPECIAL_COMMENT_BEGIN-->[\s\S]*<!--WIERD_SPECIAL_COMMENT_END-->/your new content here/gim' yourfile1.txt 

이 내용은 파일을 새롭게 변경된 내용으로 대체한다는 점에 유의하십시오.