Tengo un db.sql lleno de líneas que en algún momento contienen la cadena _wc_session_

(26680, '_wc_session_expires_120f486fe21c9ae4ce247c04f3b009f9', '1445934089', 'no'),
(26682, '_wc_session_expires_73516b532380c28690a4437d20967e03', '1445934114', 'no'),
(26683, '_wc_session_1a71c566970b07ac2b48c5da4e0d43bf', 'a:21:{s:4:"cart";s:305:"a:1:{s:32:"7fe1f8abaad094e0b5cb1b01d712f708";a:9:{s:10:"product_id";i:459;s:12:"variation_id";s:0:"";s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:6;s:8:"line_tax";i:0;s:13:"line_subtotal";i:6;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}}";s:15:"applied_coupons";s:6:"a:0:{}";s:23:"coupon_discount_amounts";s:6:"a:0:{}";s:27:"coupon_discount_tax_amounts";s:6:"a:0:{}";s:21:"removed_cart_contents";s:6:"a:0:{}";s:19:"cart_contents_total";d:6;s:20:"cart_contents_weight";i:0;s:19:"cart_contents_count";i:1;s:5:"total";i:0;s:8:"subtotal";i:6;s:15:"subtotal_ex_tax";i:6;s:9:"tax_total";i:0;s:5:"taxes";s:6:"a:0:{}";s:14:"shipping_taxes";s:6:"a:0:{}";s:13:"discount_cart";i:0;s:17:"discount_cart_tax";i:0;s:14:"shipping_total";i:0;s:18:"shipping_tax_total";i:0;s:9:"fee_total";i:0;s:4:"fees";s:6:"a:0:{}";s:10:"wc_notices";s:205:"a:1:{s:7:"success";a:1:{i:0;s:166:"<a href="http://bdebarcelona.cat/carrito/" class="button wc-forward">Ver carrito</a> Se ha añadido &quot;Incienso Gaudí Lavanda&quot; con éxito a tu carrito.";}}";}', 'no'),

Me gustaría eliminar esas líneas completas con AWK cuando _wc_session_ esté dentro. Me refiero a toda la línea como:

(26682, '_wc_session_expires_73516b532380c28690a4437d20967e03', '1445934114', 'no'),

Hasta ahora he encontrado el REGEX correcto que selecciona toda la línea. cuando se encuentra " _wc_session_ "

(^\(.*_wc_session_.*\)\,)

Pero nosotras trato de correr

awk '!(^\(.*_wc_session_.*\)\,)' db.sql > temp.sql

Entiendo

awk: line 1: syntax error at or near ^

¿Me estoy perdiendo algo?

1
Giacomo Scarpino 19 ene. 2018 a las 16:54

3 respuestas

La mejor respuesta

Error en la entrada Regex, la correcta es

'!/(^(.*wc_session.*)\,)/'
1
Giacomo Scarpino 19 ene. 2018 a las 15:28

Con el simple grep siguiente puede ayudarlo en lo mismo y debería hacer el truco.

grep -v "(26682, '_wc_session_expires_73516b532380c28690a4437d20967e03', '1445934114', 'no')"   Input_file

EDIT: Si desea eliminar las líneas que solo tienen la cadena _wc_session_expires_ en cualquier línea, lo siguiente puede ayudarlo en lo mismo.

grep -v "_wc_session_expires_"   Input_file
2
RavinderSingh13 19 ene. 2018 a las 14:24

Si estás configurada en awk:

awk '!/_wc_session/' db.sql

También puede sed -i escribir la salida "in situ" (en el archivo de entrada):

sed -i '/_wc_session/d' db.sql

Editar:

Un enfoque más preciso con awk sería usar el , inherente de su archivo como delimitador y solo verifique la columna 2 para el patrón respectivo. Este enfoque es útil en caso de que el patrón esté en una columna diferente y esa línea no se elimine.

awk -F',' '$2 !~ "_wc_session" {print $0}' db.sql
3
AnythingIsFine 19 ene. 2018 a las 14:08