[완료] 여러줄 perl로 치환
글쓴이: newtypes / 작성시간: 화, 2007/12/04 - 6:50오후
수고 하십니다.
다음과 같은 문장을 가지 파일이 있다고 가정하겠습니다.
해당 파일에서 일치하는 두개의 라인을 perl 문으로 치환하려고 하는 잘되지 않네요
조언 부탁드립니다.
test abc
(탭)aaa 30
..
..
또는
test abc
(공백)aaa 30
..
..
이렇게 있을 경우
perl -i -pe "s/test abc\n\taaa 30\n/test bbb\r\tbbb 40\r/g;" test.txt
으로 치환문을 작성하여수행하면 정상적으로 동작하지 않는 것 같습니다.
탭이 아닌 여러 공백을 경우는 어떻게 하여야 하는지 도움을 부탁드립니다.
추운겨울 몸 건강하세요 ^^
Forums:
s///sg 혹은 mg 를
s///sg 혹은 mg 를 사용해보세요.
펄의 -n 이나 -p
펄의 -n 이나 -p 옵션을 사용하면, 기본적으로 입력을 한 줄씩 처리하게 됩니다.
그러므로 -p 옵션만 사용해서는 여러 줄에 걸친 입력은 변환할 수 없습니다.
그러나 -0 옵션을 사용하면 할 수는 있습니다.
(다만, 파일의 크기가 크거나 치환이 많이 발생하는 경우에는 속도가 느릴 수도 있습니다.)
--------------------Signature--------------------
Light a candle before cursing the darkness.
이렇게 해보세요.
실행하면 test.txt내의 문자열이 치환되고
원래 파일은 test.txt.bak 으로 백업됩니다.
이 one-liner의 포인트는 multi-line match를 위해 undef $/ 해서 기본으로 newline인 line seperator를 undef하고 나서 sgm modifier를 통해 multi-line match replace를 하는겁니다.
aaa 30 앞의 공백은 space든 tab이든 space,tab의 혼합이든 가리지 않고 공백이 있으면 치환할때 그부분은 $2로 가져가서 그대로 넣어줍니다.
aero 님이 하신 방법이
aero 님이 하신 방법이 참 재미있네요.
하지만 첫번째 줄을 제대로 처리하지 못하는 문제점이 있습니다.
(첫번째 줄 입력을 받고 나서 undef $/ 가 실행되니까요.)
문제점을 고치면 다음과 같습니다.
--------------------Signature--------------------
Light a candle before cursing the darkness.
와~ *.* 고수님들
와~ *.*
고수님들 감사합니다.
여러분들 덕분에 문제가 해결되었습니다.
좋은 하루 되세요 ^^
댓글 달기