패턴의 마지막 쉼표 제거

패턴의 마지막 쉼표 제거

파일(somefile.txt)에 다음 텍스트가 있는 경우:

CREATE TABLE "table_name" (
   "id" int(11) unsigned NOT NULL,
   "some_field" varchar(10),
);

CREATE TABLE "another_table" (
   "id" int(11) unsigned NOT NULL,
   "some_other_field" varchar(10),
);

각 명령문의 마지막 쉼표를 제거하여 다음과 같이 만들고 싶습니다.

CREATE TABLE "table_name" (
   "id" int(11) unsigned NOT NULL,
   "some_field" varchar(10)
);

CREATE TABLE "another_table" (
   "id" int(11) unsigned NOT NULL,
   "some_other_field" varchar(10)
);

정규식을 사용했지만 \,$\n\)에서 작동하도록 할 수 없는 것 같습니다 sed. 다음이 발생합니다.

sed: -e expression #1, char 23: Unmatched ) or \)

내가 사용할 때 :

sed -i -e 's/\,$\n\)/)/g' somefile.txt

답변1

예제와 같이 파일의 구문이 모든 곳에 있으면 다음을 사용할 수 있습니다.

sed -i -n -e '1h;1!H;${g;s/\,\n);/\n);/g;p}' somefile.txt

설명하다:

1h           # copy first line the hold buffer
1!H          # not first line -> append to the hold buffer
${           # execute at the end
   g          # copy hold buffer back to pattern buffer
   s/ ... /   # multiline replacement in pattern buffer
   p          # print pattern buffer
}

(당신은 또한 볼 수 있습니다http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/)

이렇게 하면 전체 파일이 메모리에서 읽고 저장되고 수정됩니다. 파일이 너무 크면 다른 접근 방식을 선택해야 합니다.

답변2

sed 'N;s/,\n)/\n)/;P;D' file

또는 GNU sed의 경우

sed -z 's/,\n)/\n)/g' file

아니면 어이

awk '
    f{
        if(!/);/)
            print ","
        else 
            print ""
        f=0
    }
    /,$/{
        sub(",$", "")
        printf $0
        f=1
        next
    }
    1' file

관련 정보