2014-04-29 3 views
0

나는 이미 내 스크립트에 다른 장소에 나오지도 사용하고 있기 때문에이나오지 - 여러 줄을 일치하고 경기 이상 삽입

#multi 
#line 
#comment 
$var1=foo 

#multi 
#line 
#comment 
$var2=bar 

############################################# 
# END          # 
############################################# 

이 (SED 사용하고 난 일관성을 유지하는 것을 선호처럼 보이는 파일이) 나는 COMENT + 다음 공간 + END하고 다음에 하나 이상의 주석 표시 즉, "END"섹션 전에 다음 줄을 끝 부분을 를 추가 일치 할 수있는 방법

############################################# 
# user login 
############################################# 

server.user=$USER 
server.pswd=$PASSWD 

<newline> 
<newline> 

그래서 내가 할 수있는 당신이 대답 의견을주십시오 배우고 잘하면 ne 없습니다. 추가 답변을 묻는 질문에

감사합니다! 우리는 단부 섹션의 첫 번째 라인을 다시 사용되도록

+0

일관성은 작업에 잘못된 도구를 사용하여 과도한 복잡성을 유발하지 않는 경우에 유용합니다. 그러나 때로는 전환 도구가 더 나은 옵션 일 수있는 상황에 처하게됩니다. 슬레지 해머와 쇠 지렛대로 새 벽을 만드는 것이 합리적이 아니라면, 당신이 오래된 벽을 찢어 버리는 데 사용했던 도구와 동일하기 때문에 ... – twalberg

+0

물론! 하지만 유닉스에서는 언제나 그것을 할 수있는 방법 이상의 것이 있습니다. awk, perl 등을 사용하여 사람들의 시간 낭비없이 가능하면 sed를 선호하고 싶었습니다. – eramm

답변

2
sed '/^##* END$/i\ 
# user login\ 
#############################################\ 
\ 
server.user=$USER\ 
server.pswd=$PASSWD\ 
\ 
\ 
#############################################' input 

이것은 단부의 헤더 블록은 단지 하나 개의 라인이 있다는 사실을 이용한다 삽입 된 블록의 헤더와 동일 새로운 섹션의 헤더의 첫 번째 행으로, END 블록 헤더에 대한 첫 번째 행을 새로 작성합니다. i 명령은 버퍼가 인쇄되기 전에 sed에게 텍스트를 삽입하도록 명령하고 이스케이프 된 줄 바꿈은 여러 줄의 텍스트를 삽입 할 수있게합니다.

+0

"이것은 END의 헤더 블록 단면은 단 한 줄이고 삽입 된 블록의 머리글과 같습니다. "Lovely! :-) – anishsane

+0

감사합니다. 그러나 2 가지 조건 (^ # * 다음에 # \ s END로 시작하는 줄)이 일치하지 않는 것처럼 보입니다. 그래서 텍스트는 끝 블록 앞에 삽입되었고 다른 곳에서는 삽입되지 않았 음을 항상 알고있었습니다. 파일에 추가로 하나의 코멘트를 삽입했습니다. 예를 들어, # 세계의 끝이오고 있습니다. 멀티 라인과 일치 할 수 있습니까? – eramm