[완료] 여러줄 perl로 치환

newtypes의 이미지

수고 하십니다.

다음과 같은 문장을 가지 파일이 있다고 가정하겠습니다.
해당 파일에서 일치하는 두개의 라인을 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

으로 치환문을 작성하여수행하면 정상적으로 동작하지 않는 것 같습니다.
탭이 아닌 여러 공백을 경우는 어떻게 하여야 하는지 도움을 부탁드립니다.

추운겨울 몸 건강하세요 ^^

wpcasper의 이미지

s///sg 혹은 mg 를 사용해보세요.

redneval의 이미지

펄의 -n 이나 -p 옵션을 사용하면, 기본적으로 입력을 한 줄씩 처리하게 됩니다.

그러므로 -p 옵션만 사용해서는 여러 줄에 걸친 입력은 변환할 수 없습니다.

그러나 -0 옵션을 사용하면 할 수는 있습니다.

(다만, 파일의 크기가 크거나 치환이 많이 발생하는 경우에는 속도가 느릴 수도 있습니다.)

perl -i -0pe "s/^test abc\n(\t|[ ]+)aaa 30\n/test bbb\n\tbbb 40\n/gm;" test.txt

--------------------Signature--------------------
Light a candle before cursing the darkness.

aero의 이미지

perl -pi.bak -e 'undef $/;s/(^test abc)(^\s.*?)(aaa 30$)/test bbb$2bbb 40/sgm' test.txt

실행하면 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로 가져가서 그대로 넣어줍니다.

redneval의 이미지

aero 님이 하신 방법이 참 재미있네요.

하지만 첫번째 줄을 제대로 처리하지 못하는 문제점이 있습니다.

(첫번째 줄 입력을 받고 나서 undef $/ 가 실행되니까요.)

문제점을 고치면 다음과 같습니다.

perl -i.bak -e 'undef $/; $_=<>; s/(^test abc\n)(\s*)(aaa 30$)/test bbb\n$2bbb 40/gm; print' test.txt

--------------------Signature--------------------
Light a candle before cursing the darkness.

newtypes의 이미지

와~ *.*
고수님들 감사합니다.

여러분들 덕분에 문제가 해결되었습니다.

좋은 하루 되세요 ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.