vi 치환정규식을 perl 정규식으로 바꾸고 싶습니다.

johlim의 이미지

제가 VI에서 사용하는 정규식입니다.

g/^,\+.*[^\"]$/s/[^\"]$/\"/gc

이걸 펄에서 사용하고 싶습니다.

어떻게 해야하는지요 ?

현행
gvim *.txt 로 여러파일을 일단 오픈한뒤
위 정규식으로 치환하고 "wn" 해서 다음 파일 넘어가서
다시 반복적으로 위 정규식으로 변환합니다.

하고 싶은 방법
perl script에
변환할 파일목록 담아놓고
해당 파일에 대해서 치환 정규식을 적용하고싶습니다.

사용환경 WIN32 Perl , GVIM

참고로 치환정규식 내용은
, 으로 시작하는 한줄을 찾아서 끝에 "가 없으면 "을 추가

nohmad의 이미지

$ cat test.dat
,blahblah
,blahblah"
blahbla
$ perl -p -e 's/^,(.+?)([^"])$/,\1\2"/g' test.dat
,blahblah"
,blahblah"
"blahbla
$ perl -pi -e 's/^,(.+?)([^"])$/,\1\2"/g' test.dat
$ cat test.dat
,blahblah"
,blahblah"
"blahbla

perl은 stdin 또는 파일 인수 전체를 읽을 수 있는 핸들을 가지고 있고, p 옵션은 주어진 펄 스크립트(파일로 주어질 수도 있고, -e로 주어질 수도 있습니다)가 이 핸들을 라인 단위로 반복하면서(while gets) 실행될 수 있게 해줍니다. 이 입력 핸들은 기본 값이 readonly인데, i 옵션(in-place)이 있으면 이 입력 핸들을 write 할 수 있습니다.

johlim의 이미지

사용환경 PC(WINXP)에서 Active Perl 5.6.1 사용중입니다.

D:\>type test.dat
,bbbb
#bbbb
bbbb
bbbb"

D:\>perl -p -e 's/^,(.+?)([^"])$/,\1\2"/g' test.dat
,bbbb
#bbbb
bbbb
bbbb"

D:\>perl -pi -e 's/^,(.+?)([^"])$/,\1\2"/g' test.dat
Can't do inplace edit without backup.

D:\>type test.dat
,bbbb
#bbbb
bbbb
bbbb"

다시 한번 부탁드리겠습니다.

원자료

,bbbb
#bbbb
bbbb
bbbb"

치환을 통해서 얻고 싶은 형태

,bbbb" <- 이것만 변경
#bbbb
bbbb
bbbb"

A better tomorrow

nohmad의 이미지

윈도우 커맨드라인이 -e 실행 인수에 영향을 주는 것 같군요. 그럴 때는 파일에 저장한 후에 사용하면 됩니다. 지금 주변에 펄이 깔린 윈도우 머신이 없어서 테스트는 못해봤습니다. -e 실행구문을 test.pl로 만들고, in-place 옵션에 백업 파일을 지정했습니다.

$ cat test.dat
,bbbb
#bbbb
bbbb
bbbb"
$ cat test.pl
s/^,(.+?)([^"])$/,\1\2"/g
$ perl -p test.pl test.dat
,bbbb"
#bbbb
bbbb
bbbb"
$ perl -pi.bak test.pl test.dat
$ cat test.dat.bak
,bbbb
#bbbb
bbbb
bbbb"
$ cat test.dat
,bbbb"
#bbbb
bbbb
bbbb"

i.bak 이라고 쓴 것은 대상 파일을 변경시키기 전에 원본 파일명 뒤에 .bak이 붙은 파일을 복사본으로 만들어놓고 원본 파일을 변경시킵니다. 원하는 대로 변경되었는지 확인해보고 지우면 됩니다. 윈도우에선 in-place 옵션에서 백업 파일을 만드는 것이 강제사항인가 보군요.

johlim의 이미지

알려주신대로는 또 에러가 나구요

perl -p test.pl source > result

이런식으로 사용가능했습니다.

하지만 내용이 변환결과가 이상합니다.
변환후 쓸데없이 " 가 다음줄에 하나 더 붙습니다.

아마 내용상으로 특수문자가 line에 있으면 이상하게 변환되는것 같아요


,/* KKKK */ "BBBB"
bbbb
,/* KKKK */ "BBBB
,bbbb
,bbbb"
bbbb"

결과

,/* KKKK */ "BBBB" "
bbbb
,/* KKKK */ "BBBB "
,bbbb"
,bbbb"
"bbbb"

vi에서 perl 로 바꾸기 참 어렵네요 --a

감사합니다.

A better tomorrow

송효진의 이미지

바꾸기가 어렵다면 vim 을 커맨드라인에서 실행해도 됩니다.

vim -c 'g/^,\+.*[^\"]$/s/[^\"]$/\"/gc' -c 'wq' file

nohmad의 이미지

제가 정규식 결과를 제대로 확인 안했군요. :$
다음 식은 일단 제대로 돌아갈 것 같습니다.

$ cat test.pl
s/^,(.+?)([^"])\n$/,\1\2"\n/
$ cat test.dat
,/* KKKK */ "BBBB"
bbbb
,/* KKKK */ "BBBB
,bbbb
,bbbb"
bbbb"
$ perl -p test.pl test.dat
,/* KKKK */ "BBBB"
bbbb
,/* KKKK */ "BBBB"
,bbbb"
,bbbb"
bbbb"
johlim의 이미지

D:\Project\SelfStudy>perl -p test.pl test.dat > result.dat

D:\Project\SelfStudy>cat result.dat
bbb
,bbb"
,bbb"
bbb"


D:\Project\SelfStudy>cat test.dat
bbb
,bbb"
,bbb
bbb"

근데 perl 정규식에서 \1\2는 무슨의미죠

감사합니다.

A better tomorrow

johlim의 이미지

송효진 wrote:
바꾸기가 어렵다면 vim 을 커맨드라인에서 실행해도 됩니다.

vim -c 'g/^,\+.*[^\"]$/s/[^\"]$/\"/gc' -c 'wq' file

혹시나 해보았는데 동작하지 않는군요
에러메세지는 "명령구문이 틀립니다"
사용환경 Windows XP (gvim)

A better tomorrow

leigh의 이미지

perl -p -e "s/^,(.+?)([^\"])$/,\1\2\"/g" test.dat 

첫분이 다 가르쳐주셨는데, 쉘 구문이 틀려서 그렇습니다. 유닉스 쉘에서는 argument를 ''로 감싸지만, 윈도에서는 ""로 감싸므로, -e 옵션 다음에 주는 인라인 코드는 ""로 싸줘야 쉘이 펄에 코드를 맞게 넘길 수 있습니다.

\1, \2는 back-reference라고 부르는 것으로, 괄호로 싸인 부분에 매치된 부분 문자열을 저장하고 있는 특수 변수입니다.
[/code]

...

mr.lee의 이미지

#!/usr/local/bin/perl -w

use strict;

local *FH1;
local *FH2;
my $source;
my $target;

foreach $source (@ARGV) {
        $target = "converted_" . $source;
        open(FH1, "<", $source) || die "Open $source was failed.\n";
        open(FH2, ">", $target) || die "Create $target was failed.\n";

        while (<FH1>) {
                $_ =~ s/^,[^"]*(?=\n)$/$&"/;
                print(FH2 $_);
        }

        close(FH1) || die "Close $source was failed.\n";
        close(FH2) || die "Close $target was failed.\n";
}

exit 0;

$ cat sample1.txt sample2.txt
blah
,blah"
,blah
,"
,

$ ./t.pl sample1.txt sample2.txt
$ cat converted_sample1.txt converted_sample2.txt
blah
,blah"
,blah"
,"
,"
elien의 이미지

perl 도 좋습니다만, vim 의 기능으로 해결이 가능합니다.
gvim *.txt 와 같이 여러 파일을 오픈한다음,

:bufdo! g/^,\+.*[^\"]$/s/[^\"]$/\"/g | update 와 같이 하면 됩니다.

주의할 점은 치환식이 잘못된 경우 복구할 수가 없다... 는 것이지만
이 경우엔 해당이 안되겠군요 :D

훗, 못 믿겠나?

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.