2009-08-13 3 views
1

시작과 동시에 검색을 수행하고 구성 파일을 대체하는 쉘 스크립트를 작성하려고합니다.쉘 스크립트에서 파일의 텍스트를 검색하고 바꾸는 방법은 무엇입니까?

우리가 대체하려는 문자열은 다음과 같습니다

include /etc/nginx/https.include; 

그리고 우리는 주석 버전으로 교체하려는 :

#include /etc/nginx/https.include; 

우리는 교체 할 문자열을 포함하는 파일 is :

/etc/nginx/app-servers.include 

저는 리눅스 전문가가 아니기 때문에 명령을 찾을 수 없습니다. 선이 ;에 종료하지 않을 수 있습니다 경우

+0

이것은 serverfault.com, imho에 더 적합합니다. –

+0

serverfault에 적절한 이유가 표시되지 않습니다.그것은 서버와 관련이없는 것처럼 보입니다. 수퍼 유저에 속합니다. 투표를 마치기 만하면됩니다. – rmeador

+0

/bin/sh 또는 bash 또는 csh 또는 다른 쉘이 완전한 언어입니다. 왜 "언어 Y로 X를 얻는가?"라고 생각하지 않습니까? StackOverflow에 속해 있습니까? – dmckee

답변

7
perl -p -i -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

대신 사용

perl -p -i -e 's%^(include /etc/nginx/https.include;.*)$%#$1%' /etc/nginx/ap-servers.include 

를 원본 파일을 유지하려면, -i 후 백업 확장을 추가

perl -p -i.bak -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

을 설명해. -p 플래그는 내부 교체를 의미합니다. 파일의 모든 행이 표현식에 공급되고 그 결과가 대체 파일로 사용됩니다. -i 플래그는 백업 파일의 확장자를 나타냅니다. 아무 것도 사용하지 않으면 백업 생성을 방지 할 수 있습니다. -e은 Perl에게 다음 매개 변수를 실행할 표현식으로 가져 오도록 지시합니다.

이제 표현식은 s%something%other%입니다. 나는 더 전통적인 / 대신 %을 사용하여 경로의 슬래시를 벗어나지 않도록합니다. 표현식에 괄호를 사용하고 안전을 위해 대체 표현식에 $1을 사용합니다. 하나를 변경하면 다른 표현식이 뒤 따릅니다. 따라서, %#$1%은 실제로 두 번째 %s이고, 그 다음에 괄호 안의 패턴을 나타내는 #, $1, 그리고 마지막으로 %s입니다.

HTH. 손.

+0

+1 그리고이 경우 더 좋은 또 다른 문자 (%)를 사용하는 것이 더 전통적인 / –

2

체크 아웃 sed :

sed -i -r 's|^(include /etc/nginx/https.include;)$|#\1|' /etc/nginx/app-servers.include 

-i 수단 인 장소와 -r는 확장 된 정규 표현식을 사용하는 것을 의미 대체 할.

0
cd pathname 
for y in `ls *`; 
do sed "s/ABCD/DCBA/g" $y > temp; mv temp $y; 
done 

이 스크립트는

3

은 나오지 -i의/foo는/바/g '는 config.txt 파일

이 대체 경로에있는 모든 파일에 DCBA에 문자열 ABCD을 대체 놈이야 config.txt 파일에 bar가있는 foo (대소 문자를 구분하지 않음)의 모든 인스턴스

관련 문제