2011-12-16 9 views
1
내가 font-family: Verdanased을 사용하여 font-family: ([A-Za-z ,"]+){1};의 모든 인스턴스를 대체 할

를 통해 CSS 스타일을 교체합니다. 과거에는, 다음 명령을 대체 간단한 검색 & 근무했습니다나오지 질량은 터미널

find ./ -type f -exec sed -i 's/(font\-family:){1}([\"A-Za-z, ]+){1}(;){1}/font\-family: Verdana;/' {} \; 

내가 레드햇 엔터프라이즈 리눅스에있어 : ​​그러나

find ./ -type f -exec sed -i 's/needle/replace/' {} \; 

, 나는 성공없이 다음과 같은 정규식을 시도 서버 릴리스 5.6. 또한 첫 번째 명령은 특정 파일의 첫 번째 인스턴스에서만 작동하는 것처럼 보이므로 모든 인스턴스가 대체 될 때까지 명령을 다시 실행해야합니다 ... 모든 파일의 모든 인스턴스에 대해 작업 할 수있는 명령을 개선 할 수 있습니까? 이 같은

+0

는 글로벌 교체를 위해'g' 옵션을 사용하여 시도했다. 'sed 's/needle/replace/g'' –

답변

3

먼저, 당신이 왜 작동하지 않는지에 대한 설명. 당신은 당신의 괄호, 대괄호 및 + 모두를 탈출해야하는, 그래서 다음과 같은 작업을해야합니다 :

sed -i 's/\(font\-family:\)\{1\}\(["A-Za-z, ]\+\)\{1\}\(;\)\{1\}/font-family: Verdana;/' 

다행히 그 탈출의 모든 필요를 방지하기 위해 -r 스위치를 추가 할 수 있습니다,하지만 당신은 할 수 있습니다 현재의 표현을 상당히 단순화합니다. 모든 섹션을 캡처 그룹에 넣을 필요가없고 모든 그룹에 {1}을 추가하는 것은 중복됩니다 (기본적으로 기본값 임). 당신은 모든 경우에 대해이 작업을 원하기 때문에,

sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g' 

주 글로벌 교체에 대한 추가 g 옵션 : 그래서 당신은 그것을 줄일 수 있습니다. 모두 함께

:

find ./ -type f -exec sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g' {} \; 
+0

잘 설명해 주셔서 감사합니다. – lioman

0

보십시오 뭔가 -

sed -i 's/\(font-family:\) \(.*[^;]\)\(;.*\)/\1 Verdana\3/g' 
0

내가 완전히 글꼴 - 가족의 expresion을 이해하지 확신 : font-family: ([A-Za-z ,"]+){1}; 그 일치하는 괄호하고 있고 {1} 정확히 하나의 일치를 찾고?

귀하의 정규식은 그냥 sed perl -pi로 전환 할 것만큼 복잡

: 문제가

find ./ -type f -exec perl -pi -e 's/font-family:[\"A-Za-z, ]+;/font-family: Verdana;/g' {} \; 
1

, 당신은 당신이 +

아래의 테스트를 참조 사용하기 때문에, 당신 나오지에서 -r 필요 : 모든 교체하려는 경우도

kent$ echo "oldstring_0000"|sed 's/[0]+/newstring/' 
oldstring_0000 

nothing happened. 

now with -r: 

kent$ echo "oldstring_0000"|sed -r 's/[0]+/newstring/' 
oldstring_newstring 

, 당신은 같은 'g'를 필요 'S/A/B/g의'