2016-04-19 9 views
0

Ich habe einen Dump von einer Produktion DB, aber ich möchte Daten von einigen Tabellen wie Nachrichten, Nachrichten_Dateien, usw. zu entfernen, da nicht nützlich, um Debug/Programmierung auf lokale.Löschen von Zeilen aus Datei mit sed mit verschiedenen Mustern

Ich habe diesen Befehl wurde mit den Zeilen mit dieser Art von Daten zu entfernen:

sed -i '/CREATE DATABASE/d' $current_main_db.sql && 
sed -i '/USE \`okn/d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_email_cron\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_users\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_files\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_mail_list\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_sms_cron\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_tags\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_temp_receivers\`/ d' $current_main_db.sql && 
sed -i '/INSERT INTO \`messages_threads\`/ d' $current_main_db.sql; 

Es funktioniert gut, ist aber sehr langsam, so versuche ich, alle Muster in einem sed Befehl zu kombinieren. Ich las das Handbuch und finden dies:

regexp1 \ | regexp2

Spiele entweder regexp1 oder regexp2. Verwenden Sie Klammern, um komplexe alternative reguläre Ausdrücke zu verwenden. Der übereinstimmende Prozess testet nacheinander jede Alternative von links nach rechts, und die erste, die erfolgreich ist, wird verwendet. Es ist eine GNU-Erweiterung. So

Ich habe versucht, dies:

sed -i '/CREATE DATABASE\|USE \`okn\|INSERT INTO \`messages\`\|INSERT INTO \`messages_email_cron\`\|INSERT INTO \`messages_users\`\|INSERT INTO \`messages_files\`\|INSERT INTO \`messages_mail_list\`\|INSERT INTO \`messages_sms_cron\`\|INSERT INTO \`messages_tags\`\|INSERT INTO \`messages_temp_receivers\`\|INSERT INTO \`messages_threads\`/ d' $current_main_db.sql; 

aber nicht funktionieren, habe ich versucht, ohne Erfolg Klammer für jedes Muster zu verwenden:

sed -i '/(CREATE DATABASE\|USE \`okn)\|(INSERT INTO \`messages\`)\|(INSERT INTO \`messages_email_cron\`)\|(INSERT INTO \`messages_users\`)\|(INSERT INTO \`messages_files\`)\|(INSERT INTO \`messages_mail_list\`)\|(INSERT INTO \`messages_sms_cron\`)\|(INSERT INTO \`messages_tags\`)\|(INSERT INTO \`messages_temp_receivers\`)\|(INSERT INTO \`messages_threads\`)/d' 

Bin ich etwas falsch?

Ich suche in SO und finde einige ähnliche Fragen, aber nicht für mich arbeiten.

Antwort

1

grep sollte ausreichen:

grep -vE '^(INSERT INTO `messages(_email_cron|_users|_files|_mail_list|_sms_cron|_tags|_temp_receivers|_threads)`|CREATE DATABASE|USE `okn)' file 
+0

Funktioniert nicht, ich führe Befehl umleiten auf eine andere Datei und beide Dateien hat das gleiche Gewicht – Sal00m

+0

@ Sal00m: sind SQL-Befehle am Anfang der Zeile oder gibt es führende Leerzeichen? (In diesem Fall entfernen Sie den Anker '^' oder besser ändern Sie es in '^ [\ t] *') –

+0

Die SQL-Befehle sind am Anfang der Zeile – Sal00m

1

die Klammer Flucht auch:

sed -i '/\(CREATE DATABASE\)\|\(USE \`okn\)\|\(INSERT INTO \`messages\`\)\|\(INSERT INTO \`messages_email_cron\`\)\|\(INSERT INTO \`messages_users\`\)\|\(INSERT INTO \`messages_files\`\)\|\(INSERT INTO \`messages_mail_list\`\)\|\(INSERT INTO \`messages_sms_cron\`\)\|\(INSERT INTO \`messages_tags\`\)\|\(INSERT INTO \`messages_temp_receivers\`\)\|\(INSERT INTO \`messages_threads\`\)/d' 
+0

Gleich, die Zeilen werden nicht gelöscht :( – Sal00m

1

Ihr Versuch, langsam ist, weil Sie eine neue sed Instanz für jeden Befehl starten. Und Ihre Regexp ist kompliziert, weil Sie versuchen, alle Ausdrücke auf einmal zu behandeln. Es gibt eine Kompromisslösung, aber

sed '/pattern1/d; /pattern2/d; ...' 

Beachten Sie auch, dass Sie Ihren regulären Ausdruck von @CasimirEtHippolyte wie gezeigt vereinfachen kann.

Verwandte Themen