2014-12-05 11 views
1

XML 태그를 제외한 모든 텍스트 :소문자 내가 태그 문자열의 큰 숫자를 가지고

watch <TEAM>Philly's</TEAM> Game 
what's on <TIME>Wednesday night eight o'clock</TIME> 

나는 XML 태그를 제외한 모든 텍스트를 소문자로 싶습니다. 나는.

awk '{print tolower($0)}' file.txt 

을하지만 XML 태그를 방지하는 방법을 아무 생각이 :

watch <TEAM>philly's</TEAM> game 
what's on <TIME>wednesday night eight o'clock</TIME> 

나는 모든 텍스트 AWK를 사용하여 케이스를 낮출 수 있습니다. 모든 언어/도구를 환영합니다.

답변

5

이 나오지도 (GNU) 한 줄은 도움이 될 수

sed -r 's/([^<>]*)($|<)/\L\1\E\2/g' 

당신의 예제 :

kent$ echo "watch <TEAM>Philly's</TEAM> Game 
what's on <TIME>Wednesday night eight o'clock</TIME>"|sed -r 's/([^<>]*)($|<)/\L\1\E\2/g' 
watch <TEAM>philly's</TEAM> game 
what's on <TIME>wednesday night eight o'clock</TIME> 
+0

매력처럼 작동합니다! 엔지니어의 호기심이 이제 어떻게 작동하는지 묻습니다! 명령을 설명해 주시겠습니까? 두 개의 캡처 그룹으로 검색/바꾸기 명령을 볼 수 있지만 더 이상 볼 수는 없습니다 .. –

+0

@xeon은'\ L \ 1 \ E \ 2'를'###### \ 2'로 바꿉니다. 시합. '\ L \ E'에 대한 자세한 정보는 sed 정보를 읽으십시오. – Kent

+0

이 경우'\ E'는 쓸모가 없습니다. – BMW

2
여기
sed -e 's/\(.*\)/\L\1/' -e 's/\(<[^>]*>\)/\U\1/g' fileName 
+0

이 솔루션은 첫 번째 답변과 비교하여 두 개의 명령을 결합한 것처럼 보입니다. \ E 대신 \ U를 사용하는 이유는 무엇입니까? –

+2

@xon, 약간 다른 접근법입니다. 첫 번째 표현식은 모든 것을 소문자로 변환하고 두 번째 표현식은 < and > 사이의 모든 문자를 대문자로 변환합니다. 현재 모든 XML 태그가 대문자가 아닌 경우 유용 할 수 있습니다. –

1

는 방법으로 할 수 있습니다 awk

awk -F"<|>" '{for (i=1;i<=NF;i++) printf "%s",(i%2?tolower($i):"<"$i">");print ""}' file 
watch <TEAM>philly's</TEAM> game 
what's on <TIME>wednesday night eight o'clock</TIME> 

필드를로 구분합니다.또는 >을 입력 한 다음 해당 시점의 라인 1 필드를 반복합니다.
만약 그 이상이라면 더 낮추십시오. 이상하게 들리면 <>

관련 문제