複数の挿入コマンドを含むSQLダンプファイルがあります。削除したいです。sedまたはgrep(または別のシンプル強く打つ技術)、条項の特定の列、およびそれに対応するデータVALUES
。したがって:
INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);
sedまたはgrepは"mslink"
列とその値を削除する必要があります。どちらも場所4"189"
にあります。価値がない不要な列の元の場所がわかりません。したがって、正規表現はある種のメモリを使用して削除する必要があります。n番目クエリ値はN場所"mslink"
。
一つ不完全 sedコマンドは次のとおりです。
sed -re 's/INSERT INTO "capt" \((.*,?)*"mslink",?(.*,?)*\) VALUES \((.*,?)+\);/INSERT INTO "capta" (\1\2) VALUES (\3)/' file.sql
答え1
私はこれを行うことができるPerlコードの1行を考えることはできませんが、ここにあなたが望むものを実行するPerlスクリプトがあります。
$matchを検索したいものに変更してください。このスクリプトはファイル全体を繰り返し、結果ファイルを標準出力に出力します。結果をファイルにパイプすると、変更が適用されます。コードについてもっとコメントしたいと思いました。すみません。
スクリプトは括弧内にデータがあり、カンマで区切られたキーワード「VALUES」を使用します。それ以外の場合は失敗する可能性があります。
コードが "sql_parser.pl" として保存されている場合は、%>perl sql_parser.pl [file] コマンドを実行します。
#!/usr/bin/perl
#
use strict;
sub usage
{
print "usage: sql_parser.pl [file]\n";
}
# load the input file
sub load
{
my $file = shift;
open my $in, "<", $file or die "unable to open $file as input $!";
my @data = <$in>;
close $in;
foreach (@data) { chomp; s/\cM//g; }
return @data;
}
# what to search for
# could supply this parameter on the command line too
# my $match = shift;
my $match = 'mslink';
# get the file to process on the command line
my $file = shift;
{
# load the data
my @lines = &load($file);
#print "$_\n" foreach (@lines);
# loop through the data in the file
foreach (@lines)
{
# match the line of text
my @f = m/(.*?\() (.*?) (\)\s+?VALUES\s+?\() (.*?) (\).*?$)/x;
if (@f)
{
my @cmds = split /,/, $f[1];
my @nums = split /,/, $f[3];
my $matched = 0;
for ( my $i = 0; $i < @cmds; ++$i )
{
if ( $cmds[$i] =~ /$match/ )
{
#print "$cmds[$i]\n";
undef $cmds[$i];
undef $nums[$i];
$matched = 1;
last;
}
}
( $f[1] = join ',', @cmds ) =~ s/\,\,/,/;
( $f[3] = join ',', @nums ) =~ s/\,\,/,/;
if ($matched)
{
$_ = join ' ', @f;
}
}
}
print "$_\n" foreach (@lines);
}
このデータに対して次のスクリプトを実行しました。
INSERT INTO "capt" ("fid_c1","id","fid_capt","mslink","capt", ...) VALUES ('0','0','24','189','CAP.FU1', ...);
$perl sql_parser.pl test.dat 出力は次のようになります。
INSERT INTO "capt" ( "fid_c1","id","fid_capt","capt", ... ) VALUES ('0','0','24','CAP.FU1', ... );
キャプチャ出力:$ perl sql_parser.pl test.dat> Capture.txt