2012-09-27 3 views
5

특정 줄에있는 모든 {}을 []로 대체하고 싶지만, 불행히도 나는 정규식의 마지막 항목 만 일치시킬 수 있습니다.마지막 일치 항목 만 바꾸기 sed - 모두 일치해야 함

나는 다음과 같은 구조를 가지고 설정 파일이 있습니다

entry { 
    id  123456789 
    desc This is a description of {foo} and was added by {bar} 
    trigger 987654321 
} 

을 나는이 마지막 경기 '바'가 아니라 'foo는'대체 할 수있는, 다음의 sed :

sed s'/\(desc.*\){\(.*\)}/\1\[\2\]/g' < filename 

'desc'가 포함 된 행에이 검색을 고정시킵니다. 각 'entry'블록의 구분 괄호를 대체하는 것이 싫기 때문에이 검색을 앵커합니다.

내 인생에서 나는 모든 사건을 대체하는 방법을 알 수 없습니다.

언제든지 도움이됩니다. 하루 종일 배우고 내 각막이 깨질지도 모른다는 자습서를 더 이상 읽을 수 없습니다.

감사합니다.

답변

4

다음보십시오 :

sed '/desc/ s/{\([^}]*\)}/[\1]/g' filename 

검색 만 정규식 /desc/ 일치하는 라인을 위해 수행됩니다 위의 명령에서 대체 그러나 나는이 실제로 필요하다고 생각하지 않기 때문에 나오지 프로세스 텍스트 한 번에 한 줄 씩만 입력 할 수 있기 때문에 'entry'블록에서 중괄호를 바꾸지 않아도됩니다. 이것은 당신이 아마 다음에이 작업을 단순화 할 수 있음을 의미합니다 :

sed 's/{\([^}]*\)}/[\1]/g' filename 

대신, 닫는 괄호를 제외하고는 처음부터 일치하지 않습니다 그런 식으로 모든 일치합니다 [^}]*가 사용되는 캡처 그룹의 내부 .* 마지막으로 닫을 때까지 열립니다.

또한 입력 리디렉션을 사용하는 대신 파일 이름을 sed의 최종 인수로 제공 할 수 있습니다.

+0

감사합니다 F.J, 그 위대한 일했습니다! (PS - 분명히 3 분 안에 대답 할 수 있습니다 :-) – halfpasthope

관련 문제