ファイル(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