2010-08-13 3 views
1

일회용 perl -pi -e 명령을 사용하여 bash 스크립트에서 간단한 검색 및 바꾸기 명령을 사용하고 있습니다. 나는이에 도달 할 때까지 내 정규 표현식에의 대부분은 잘 작동 :현재의 Perl 편집 중에 단일 문자열 정규 표현식 사용

perl -pi -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml 
perl -pi -e 's#\</Table.*#\</Table\>#s' 1.xml 

대신 슬래시의 # 표시를 신경 쓰지 마십시오, 내가 더 많은 문자를 이스케이프 싶지 않았다. 이러한 regexes는 기본적으로 excel에서 내 보낸 XML 파일의 청크를 삭제하지만 작동하지 않습니다. 이것은 문자열에 적용되는 논리를 사용하고 파일에 적용하려고하기 때문에 (필자는 펄의 내부 편집에 대한 기본적인 이해 만하고 있음).

셸 스크립트 내에서 실행할 수있는 다른 방법 (perl, awk 또는 sed)을 사용할 수 있습니까?

+0

가장 작은 예제 파일을 표시하고 수정하려는 항목과 어떤 방식으로 유효한 XML 파일이 아닌지를 지적 할 수 있습니까? –

+0

궁극적으로 필자는 정규 표현식을 bash 스크립트에서 perl 도우미 스크립트를 호출하여 작동 시키지만 도움을 주셔서 감사합니다. 그리고 가장 작은 예제 파일은 0.5 메가 바이트입니다. 나를 믿어도 좋지 않습니다. – Gnats

답변

4

줄 처리 모드에서 perl 설정을했지만, 일치시키려는 패턴이 여러 줄에 걸쳐있을 가능성이 있습니다. perl 스크립트를 확장하여 전체 파일을 읽은 다음 전체 파일에 대해 정규식을 실행해야합니다.

4

regexes를 사용하여 명령 줄에서 XML 파일을 편집하는 개념을 포기하고 대신 적절한 XML 구문 분석기를 사용하는 것이 좋습니다.

+0

일반적으로 이해하지만이 상황의 상황은 불행하게도 필요합니다. – Gnats

+0

@Interwebs : 어떻게 그렇게? – Ether

+0

@Ether : 유효한 XML을 생성하지 않는 도구의 출력을 가져 와서 유효하게 만들어야합니다. 아무도 도구를 고치는 것을 방해 할 것이 거의 확실합니다. 그리고 그것이 유효하지 않기 때문에, 나는 그것을 거의 파싱 할 수 없다. – Gnats

2

몇 가지 : 작업에 대한 더 나은 도구가 있기 때문에 XML 파일을 조작하는 정규 표현식에를 사용하여

  • 마십시오. 동일한 필요성을 달성하려면 XML::Simple 또는 XML::Twig 모듈을 고려하십시오.
  • 찾기 및 바꾸기 작업이 여러 개인 경우 한 줄짜리 줄을 적절한 펄 스크립트로 바꾸고 대신 Bash 스크립트에서 호출하십시오.
2

명령 줄에서 -0777 플래그를 추가하여 perl로 하여금 전체 파일을 읽도록하고 (/ 할 정규 표현식 플래그가 있는지 확인하십시오.). 따라서 :

perl -pi -0777 -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml 
perl -pi -0777 -e 's#\</Table.*#\</Table\>#s' 1.xml 
+0

패턴이 파일에서 두 번 이상 나타날 수있는 경우'/ g '을 추가해야합니다. –