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.
Funktioniert nicht, ich führe Befehl umleiten auf eine andere Datei und beide Dateien hat das gleiche Gewicht – Sal00m
@ 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] *') –
Die SQL-Befehle sind am Anfang der Zeile – Sal00m