2014-08-28 4 views
1

파일 A : a nginx config가 있습니다. 이 파일의 어딘가에 내가문자열을 파일의 내용으로 바꿉니다.

{here} 내가 다른 파일 B의 내용으로 그 {here}를 교체하려는 있습니다 AWK (GSUB)을 나오지와 내가 시도

location /blah { 
    proxy_pass "https://blah.com"; 
} 

하지만 난이 반환/이스케이프 처리되지 않은 문자 문제.

해결책을 찾았지만 패턴 만 사용하면 은 대체과 함께 작동하지 않습니다. 이 예에서 그것을 대체하는 대신 내 마커 후 fileB을 추가합니다 :

sed -i '/{here}/{r fileB 
:a;n;ba}' nginx.conf 
+1

가능한 [특정 텍스트 다음에 파일에 텍스트 삽입] (http://stackoverflow.com/questions/25556211/insert-text-into-file-after-a-specific-text). 방금이 질문에 답했고 매우 비슷합니다. 특히 awk 기술이 효과적입니다. –

+0

사실, 조금 다릅니다. 어쨌든 대답을 게시했습니다. –

답변

2

이 그것을 수행해야합니다

awk 'NR==FNR { a[n++]=$0; next } 
/{here}/ { for (i=0;i<n;++i) print a[i]; next } 
1' fileB fileA 

는 교체를 포함하는 파일의 라인을 모두 포함되고있는 배열을 구축 할 수 있습니다. 패턴이 두 번째 파일에서 일치하면 모든 행을 인쇄하십시오. 그렇지 않으면 끝에있는 1은 원래 줄이 인쇄되었음을 의미합니다.

에드가 올바르게 지적했듯이 루프 초기화 프로그램이 잘못되었습니다. i=0으로 변경 했으므로 첫 번째 줄이 인쇄됩니다. 또한 이것은 {here}이 들어있는 줄 전체 내용을 대체합니다. 필요한 내용 일 수도 있고 아닐 수도 있습니다.

원본 파일을 덮어 쓰려면, 당신은 할 수있다 :이 (GNU가 나오지도) 당신을 위해 작동 할 수

awk '...' fileB fileA > tmp && mv tmp fileA 
+0

이 awk 솔루션을 이용해 주셔서 감사합니다! 나는 내가 게시 한 것에 대한 대안으로 sed를 보는 것에 매우 관심이있다. – Bastien974

+0

문제 없습니다. 아마 나보다 나은 sed 기술을 가진 사람이 sed 솔루션을 제공 할 수있을 것입니다. –

+0

'n ++'대신'++ n '일 필요가 있으므로 배열은 0 대신 1에서 시작하고 루프는'<= n'에서 끝나야합니다. 지금은 fileB의 첫 번째 행 인쇄를 건너 뜁니다. 이것은'{여기} '를 fileB의 내용으로 대체하지 않고'{여기}'를 포함하는 전체 줄을 대체합니다. –

0

:

sed 's/\(.*\){here}\(.*\)/echo '\''\1'\''$(cat fileB)'\''\2'\''/e' fileA 
+0

나는 그것을 시도했다, 그것은 반환 문자를 fileB에 보관하지 않는다. 내가 올바르게 이해한다면, 당신은 패턴 앞뒤에있는 것을 포착하고, 그것들을 fileB 주위에 에코합니다. 나는 그 모든 un un/escaped quote에서 조금 잃어 버렸습니다. – Bastien974

2

당신이 필요가 :

awk 'NR==FNR{rep=(NR>1?rep RS:"") $0; next} {gsub(/{here}/,rep)}1' fileB nginx.conf 

fileB가 &을 포함하지 않는다고 가정하면 대체 연산에 의해 RE 일치 문자열로 해석 될 것입니다. 그런 다음 루프에서 index() 및 substr()을 사용하십시오.

{here}이 줄에있는 유일한 경우 문제에 대해 조금 더 간단하게 알려주십시오.

관련 문제