2011-02-15 4 views
1

저는 정규식에 새로운 브랜드입니다. 파일의 줄을 주석으로 처리하는 스크립트를 작성하려고합니다. 그래서 우리가 네트워크 컴퓨터를 은퇴 할 때 수동으로 주석 처리 할 필요없이 관리 파일 (rdist 등)에서 제거 할 수 있습니다. 내가 지금까지 가지고하면 testfiles 일이 줄의 시작 부분에 표시 대상 문자열이있을 때,하지만 문자열 중간에 어딘가에하지 않을 경우이 작동regex/sed가 검색 문자열이있는 행을 인식하도록하려면 어떻게합니까?

#!/bin/bash 

echo $*      
NAMES=$*      
FILES="/foo/testfile1   
/foo/testfile2" 

for name in $NAMES 
     do    
     sed -i "s/${name}/#&/g" $FILES 
done 
exit 0 

입니다. 문자열의 시작 부분에 sed 또는 regex에 해시를 삽입하려면 어떻게해야합니까?

(나는 온라인 튜토리얼을 통해 자신의 길을 읽었지 만, 내가 원한 것에 가장 가까운 것은 캐럿^인 것 같다. 설명에서 얻은 것은 다중 행 모드에서만 행의 시작 부분에있는 문자열의 인스턴스를 반환합니다.

저는 RedHat 5.5에서 gedit 2.8.1을 텍스트 편집기로 사용하고 sed 4.1.2를 사용하고 있습니다.

도움을 주셔서 감사합니다.

답변

2

아래 스크립트는 전달 된 인수를 받아 들여 전체 단어로 찾습니다. 인수가 foo 인 경우 blah foo bar은 주석 처리되지만 blahfoo bar은 주석 처리되지 않습니다. 또한 라인이 여러 인수와 일치하는 경우 줄의 처음에 하나만 가져 오도록 코드가 추가되었습니다.

#!/bin/bash 

FILES="./test1 ./test2" 

for name; do 
    sed -i "/\<$name\>/s/^#*/#/" $FILES 
done 
0

SiegeX에서 구조를 도둑질하고 나오지 프로그램 단순화 :

#!/bin/bash 

FILES="./test1 ./test2" 

for name; do 
    sed -i "s/^.*$name.*$/#&/" $FILES 
done 

아이디어는 즉를하기보다는 선택하고 다음의 편집 패턴을 사용하여 수행 할의 패턴을 사용 둘 다 - 목표 이름을 포함하는 완전한 라인을 인식하고 주석 처리 된 버전으로 대체하십시오.

이름을 하나의 큰 정규 표현식으로 병합하면 더욱 우아하게 처리 할 수 ​​있습니다. 그것은 sed가 N이 아니라 하나의 패스를 만드는 것을 허용 할 것입니다. 나는 그것을 독자에게 운동으로 남겨두기에 충분합니다. ...

+0

얼마나 재미 있나. 마지막 단락에 완전히 동의하지는 않지만 전체 단어가 아닌 부분을 잘못 주석으로 처리합니다. 또한'\ &'전에는 본 적이 있지만'\ 0'은 본 적이 없습니다. 그게 효과가 있니? – SiegeX

+0

@SiegeX : 그것은 GNU sed 4.2.1에서 작동합니다; 반사에, \ & 당연히 더 정확할 것입니다 - 그에 따라 내 대답을 편집 할 것입니다. 마지막 단락에 대해서 - 전체 단어가 아닌 단어의 의미에 대해 확장 할 수 있습니까? –

+0

RE : 전체 단어가 일치하지 않음 : 매개 변수 중 하나가'bar' 인 경우's /^.*$ 이름. * $/# \ & /''이 스크립트는 fubar입니다. '행을 주석 처리합니다 우리는 피하려고 노력해야합니다. 우리는'\ < \>'과 일치하는 단어를 감싸서 sed에게 전체 단어들만 일치하도록 지시함으로써 이것을 할 수 있습니다. 두 번째 단락에 대한 나의 권고를 무시하고,'\ < \>'을 args 주위에'\ | '번갈아 사용하는 한 줄을 가질 수 있습니다. 그 스크립트는 그 시점까지 Klingon처럼 보일 것입니다. – SiegeX

관련 문제