정규식 여러 줄 패턴 및 바꾸기

정규식 여러 줄 패턴 및 바꾸기

마이그레이션 프로세스를 위해 bash 스크립트에서 일부 대체 작업을 수행해야 합니다.

따라서 내 .txt 파일에는 다음과 같은 인용문이 있습니다.

{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}

내가 해야 할 일은 다음 형식을 사용하여 이러한 모든 이벤트를 편집하는 것입니다.

=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  1. {{ }} 삭제되었습니다.
  2. === === 첫 번째 줄에 추가되었습니다.

내가 하려는 것은 대체 작업을 수행하기 위해 sed 정규식을 작성하는 것입니다.

sed -i -e 's/{{Info DOC/=== Info DOC ===/g' test_file.txt

따라서 예상대로 작동하지만 "}}" 문자열로는 동일한 작업을 수행할 수 없습니다. 왜냐하면 예상한 대로 더 많이 일치하기 때문입니다.

다음과 같이 구현하려고 합니다.

find . -name '*.txt' -exec perl -i -pe 's/{{Info DOC\(.*\)}}/=== Info DOC ===\n\1/g' {} \;

나에게 몇 가지 단서를 제공해 주시면 좋을 것 같아요! 다들 감사 해요!

마지막 해결책:(@Sundeep에게 감사드립니다)

find . -name '*.txt' -exec perl -i -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' {} \;

추신: 저는 MacOS 시스템에서 bash v4를 사용하고 있습니다.

답변1

다음을 시도해보세요:

$ # tested on GNU-sed, not sure of syntax for other versions
$ sed '/{{Info DOC/,/}}/ { s/{{\(Info DOC\)/=== \1 ===/; /}}/d }' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • /{{Info DOC/,/}}/포함 라인에서 {{Info DOC포함 라인으로 }}(참조범위 주소세부)
    • s/{{\(Info DOC\)/=== \1 ===/필요에 따라 변환
    • /}}/d이것을 삭제하다
    • 나머지 행은 변경되지 않습니다.


그리고perl

$ perl -0777 -pe 's/\{\{(Info DOC)(.*?)\}\}\n/=== $1 ===$2/sg' ip.txt
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
  • -0777전체 파일을 후루룩 마시기 때문에 이 솔루션은 너무 큰 입력 파일에는 적합하지 않습니다.
  • .*?탐욕스럽지 않은 일치
  • s수정자는 .개행 문자 일치도 허용합니다.

관련 정보