마이그레이션 프로세스를 위해 bash 스크립트에서 일부 대체 작업을 수행해야 합니다.
따라서 내 .txt 파일에는 다음과 같은 인용문이 있습니다.
{{Info DOC
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
}}
내가 해야 할 일은 다음 형식을 사용하여 이러한 모든 이벤트를 편집하는 것입니다.
=== Info DOC ===
|author= ME
|company= MY COMPANY
|classification= RESTRICTED
- {{ }} 삭제되었습니다.
- === === 첫 번째 줄에 추가되었습니다.
내가 하려는 것은 대체 작업을 수행하기 위해 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
수정자는.
개행 문자 일치도 허용합니다.