2011-04-19 8 views
4

멀티 라인 sed 범위 일치를하려고합니다. 이것이 의미하는 바는 범위의 시작 자체가 여러 줄이라는 것입니다. 소스이sed 멀티 라인 범위 일치

<filter-mapping> 
     <filter-name>Cache Filter - Resource</filter-name> 
     <url-pattern>*.css</url-pattern> 
</filter-mapping> 
<filter-mapping> 
     <filter-name>Cache Filter - Resource</filter-name> 
     <url-pattern>*.html</url-pattern> 
</filter-mapping> 
<filter-mapping> 
     <filter-name>Cache Filter - Resource</filter-name> 
     <url-pattern>*.js</url-pattern> 
</filter-mapping> 
<filter-mapping> 
     <filter-name>Cache Filter - Resource JSP</filter-name> 
     <url-pattern>*.jsp</url-pattern> 
</filter-mapping> 

유사하며 범위를 시작하는 고유하게 식별하는 세그먼트는 전체 제 산신 그 범위의 끝은 전 마지막 두 라인에 의해 식별된다.

범위 매치를 시작하기 위해 여러 패턴을 지정할 수있는 방법이 있습니까? http://www.grymoire.com/Unix/Sed.html#uh-47

+0

무엇을 찾으시겠습니까? 출력물을 보여주십시오. – kurumi

+0

전체 블록을 일치시키고 싶습니다. (원본 입력 파일이 더 큼). – mark

답변

1

가장 좋은 나오지 튜토리얼 온라인이 주제를 다루고 perl -0777 -pe 's/.../.../'을 사용하거나 적절한 구문 분석기를 사용하십시오.

sed를 사용하지 마십시오. 정말.

0

가장했다 : 당신은 나오지도 상당히 새로운 경우 http://www.grymoire.com/Unix/Sed.html#uh-51

, 당신은 아마 페이지까지 더 시작 여기처럼 할 :

+0

괜찮 았으면 알 겠어. 파서가 필요하다고 생각하지 않습니다. 왜냐하면 xml을 파싱하지 않고 상수 (다중 라인) 문자열과 일치하기 때문입니다. xml이 일반 언어가 아니라는 사실은 중요하지 않습니다. – mark

4

좋아, 그래서 나는 tchrist의 해결책을 가지고 가서 펄을 대신 사용했다. 내 정규식은 다음과 같습니다 (이 예에서는 xml을 주석 처리하고 있습니다). 나는 또한 파일의 인라인 대체를하고있다. (유용 감사합니다!) 진주 접근 방식을 사용

perl -0777 -pi -e 's|([\t ]*<filter-mapping>\s*<filter-name>Cache Filter - Resource</filter-name>\s*<url-pattern>\*\.css[^\0]*<filter-name>Cache Filter - Resource JSP</filter-name>\s*<url-pattern>\*\.jsp</url-pattern>\s*</filter-mapping>)|<!-- \1 -->|g' inputfile 
1

, 나는 단지 수정으로 여러 줄 일치를 수행 할 수 있었다.

Tomcat의 web.xml에서 매개 변수를 바꾸기 위해이 태그를 사용하고 있기 때문에 관심이있는 모든 사용자를 위해 bash 스크립트 사본을 배치합니다 (주석 환영).

#!/bin/bash 
if [[ -z "$3" ]] ; then 
     echo "Sets a Tomcat web.xml parameter with a new value" 
     echo "SINTAX: $0 PARAM_NAME NEW_VALUE FILE" 
     exit 1 
fi 

PARAM_NAME="$1" 
NEW_VALUE="$2" 
FILE="$3" 

perl -0777 -pi -e "s|(<param-name>${PARAM_NAME}</param-name>.*?<param-value>).*?(</param-value>)|\${1}${NEW_VALUE}\${2}|s" ${FILE} 

참고 : 일부 \ $ {1}는 {NEW_VALUE}는 하나 개 이상의 숫자가 될 수 $ 있기 때문에이 방법을 수행하며 펄을 혼동한다. 필터 maping 내가 아주 정확하게 당신이 원하는 것을 이해하지 못했다

<filter-mapping> 
     TEXT 
</filter-mapping> 

사이

sed ' /<filter-mapping>/,/<[/]filter-mapping>/{/filter-mapping/d}' FILE 

이 인쇄 텍스트 만 :

+0

이 다음과 같이 XML에 뭔가 다른 MY_PARAM_VALUE을 변경하는 것입니다 : <상황 PARAM> MY_PARAM MY_PARAM_VALUE jmc

1

여기에 여러 줄의 sed를 사용하여 처리합니다. ..

관련 문제