Re: query complicata con espressioni regolari
ok, mi riposnto da solo... ecco lo scrit funzionante... non ho ancora
fatto le prove di carico... ma ad occhio è rapido, per lo meno nei
test
----------------------
#!/bin/bash
#exit
source config.conf
max_post_id=$(mysql --database="$MYDB" --user=$USER
--password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
phpbb_posts;"
)
#"
max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
# solo per test test
#max_post_id=$1
while [ $max_post_id -gt 0 ]; do # ciclo while ecluso per test
post_username=$(mysql --database="$MYDB" --user=$USER
--password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
post_id= $max_post_id;")
post_username=$(echo $post_username | sed 's|^post_username ||')
echo "#######################################################################"
echo max_post_id=$max_post_id
echo post_username=$post_username
post_text=$(mysql --database="$MYDB" --user=$USER
--password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
post_id
= $max_post_id;")
post_text=$(echo $post_text | sed 's|^post_text ||')
# echo $post_text
Trigger=$(echo $post_text | sed 's|<br>|\n|g' | sed
"s|\[quote\]$post_username,\([0-9/]*\), \([0-9:]*\)\]|AA#AA|"
| grep AA#AA)
# echo Trigger1=$Trigger
if [ -z $Trigger ]; then
Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
\([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
\([0-9:]*\)\]|AA#AA|I" | sed 's|<br>|\n|g' | grep AA#AA )
# echo Trigger2=$Trigger
fi
if [ -z $Trigger ]; then
Trigger=$(echo $post_text | sed "s|Data originale: \([0-9-]*\)
\([0-9:]*\),<br><br>\[quote\]$post_username,\([0-9/]*\),
\([0-9:]*\)\]|AA#AA|" | sed 's|<br>|\n|g' | grep AA#AA | uniq)
# echo Trigger3=$Trigger
fi
if [ $Trigger = "AA#AA" ] 2>/dev/null ; then
new_post_text=$(echo $post_text | sed
"s|\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
\([0-9:]*\)\]<br>||I" | sed 's|\"|\\"|g')
new_post_text=$(echo $new_post_text | sed "s|Data originale:
\([0-9-]*\) \([0-9:]*\),<br><br>\[quote\]$post_username,\([0-9/]*\),
\([0-9:]*\)\]<br>|Data Originale: \1 \2<br><br>|I" | sed 's|\"|\\"|g'
)
new_post_text=$(echo $new_post_text | sed "s|Data originale:
\([0-9-]*\) \([0-9:]*\),<br><br>\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
\([0-9:]*\)\]|Data Originale: \1 \2<br>|I")
new_post_text=$(echo $new_post_text | sed
's|\[url-local:\([a-zA-Z0-9]*\)\]attachment/\([a-zA-Z0-9_#&%.;]*\)\[/url-local:\([a-zA-Z0-9]*\)\]||')
# echo $new_post_text
mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
"UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
\"$max_post_id\""
else
echo "####################################
lascio inalterato"
fi
let max_post_id=max_post_id-1
done
exit
----------------------
ciao
MaX
2015-02-13 21:08 GMT+01:00, MaX <maxlinux2000@gmail.com>:
> mmmm ho fatto alcune correzzioni a questa bozza.
> Quello che mi scoccia è che lavorando cosí va a aggiornare tutti i
> post del database, sia che siano da modificare o meno.
> Bisognerebbe trovare il modo per detectare che il post è da moficicare
> e poi mettere una condizione if
>
> -----------------------
>
> #!/bin/bash
> source config.conf
>
> max_post_id=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT MAX(post_id) AS post_id FROM
> phpbb_posts;")
> #"
> max_post_id=$(echo $max_post_id | sed 's|^post_id ||')
> echo max_post_id=$max_post_id # numero da usare per il ciclo for o while
>
> # solo per test test
> #post_id=100000
>
> while [ $max_post_id = 0 ]; do # ciclo while ecluso per test
> post_username=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
> post_id= $max_post_id;")
> post_username=$(echo $post_username | sed 's|^post_username ||')
> echo post_username=$post_username
>
> post_text=$(mysql --database="$MYDB" --user=$USER
> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
> post_id= $max_post_id;")
> post_text=$(echo $post_text | sed 's|^post_text ||')
>
> new_post_text=$(echo $post_text | sed
> "s|\[quote:\([a-zA-Z0-9]*\)\]$post_username,\([0-9/]*\),
> \([0-9:]*\)\]<br>||I")
> echo $new_post_text
> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
> \"$max_post_id\""
>
> let max_post_id=max_post_id-1
> done
>
> exit
>
>
>
>
> -----------------------
>
> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>> opss rileggento ho visto un errore:
>>
>> while [ $post_id = 0 ]; do --> while [ $max_post_id = 0 ]; do
>>
>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>> pensavo di fare una cosa del genere, ma si tratta di 400.000 post, e
>>> non si se è abbastanza veloce
>>>
>>> --------------------------------------
>>> source config.conf
>>>
>>> post_id=$(mysql --database="$MYDB" --user=$USER --password="$PASSWD"
>>> -e "SELECT MAX(post_id) AS post_id FROM phpbb_posts;")
>>>
>>> max_post_id=$(echo $post_id | sed 's|^post_id ||')
>>> #echo max_post_id=$max_post_id # numero da usare per il ciclo for o
>>> while
>>>
>>> while [ $post_id = 0 ]; do
>>>
>>> post_username=$(mysql --database="$MYDB" --user=$USER
>>> --password="$PASSWD" -e "SELECT post_username FROM phpbb_posts WHERE
>>> post_id= $post_id;")
>>> post_username=$(echo $post_username | sed 's|^post_username ||')
>>> # echo post_username=$post_username
>>>
>>> post_text=$(mysql --database="$MYDB" --user=$USER
>>> --password="$PASSWD" -e "SELECT post_text FROM phpbb_posts WHERE
>>> post_id= $post_id;")
>>> post_text=$(echo $post_text | sed 's|^post_text ||')
>>>
>>> new_post_text=$(echo $post_text | sed
>>> "s|\[quote:3pjjad9s\]$post_username,\([0-9/]*\),
>>> \([0-9:]*\)\]<br>||I")
>>> # echo $new_post_text
>>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>> "UPDATE phpbb_posts SET post_text = \"$new_post_text\" WHERE post_id =
>>> \"$post_id\""
>>>
>>> let post_id=post_id-1
>>> done
>>> --------------------------------------------
>>>
>>> ...che ne dite?
>>> MaX
>>>
>>> Il 13/02/15, MaX<maxlinux2000@gmail.com> ha scritto:
>>>> ciao a tutti
>>>>
>>>> avrei un problema con le espessioni regolari dentro ad una query mysql
>>>> inglobata a sua volta in uno script :)
>>>>
>>>> chpass() {
>>>> mysql --database="$MYDB" --user="$USER" --password="$PASSWD" -e
>>>> "UPDATE phpbb_users
>>>> SET user_password = \"$HPPASS\" WHERE username = \"$PHPBB_USER\""
>>>> }
>>>>
>>>> questo sopra è un esempio che uso per modificare via script la passwd
>>>> di un utente in phpbb.
>>>>
>>>> Ora peró vorrei cancellare una parte di testo dal campo "
>>>> phpbb_posts/post_text" ma solo se dentro a questo testo appare:
>>>> [quote]nome utente,20/7/2012, 19:54] e il nome utente coicide con il
>>>> relativo campo " phpbb_posts/post_username"
>>>>
>>>> Praticamente c' è da cancellare la linea "[quote]Alfredo,20/7/2012,
>>>> 19:54]" solo se nel campo "post_username" il nome coincide con
>>>> "Alfredo".
>>>>
>>>> A complicare le cose... la data di fianco è variabile, e il
>>>> "[quote]Alfredo,20/7/2012, 19:54]"
>>>> è sempre nella seconda linea
>>>>
>>>> Come se non bastasse, se nel messsaggio compare un
>>>> "[quote]Alfredo,20/7/2012, 19:54]", ma nel "post_username" il nome è
>>>> differente da "Alfredo", allora bisogna lasciarlo.
>>>>
>>>> ..e naturalmente il resto del messaggio deve rimanere inalterato.
>>>>
>>>> qualche idea?
>>>>
>>>> io stavo pensando di estrarre il post_id,post_text,post_text con una
>>>> query, fare le comparazioni con gli strumenti della shell linux,
>>>> togliere eventualemente il testo e poi reimmettere il testo modificato
>>>> usando come riferimento il post_id
>>>>
>>>> o ci sono soluzioni migliori... e più rapide... interne a mysql?
>>>>
>>>> ciao
>>>> MaX
>>>>
>>>
>>>
>>> --
>>> ciao,
>>> MaX
>>>
>>
>>
>> --
>> ciao,
>> MaX
>>
>
>
> --
> ciao,
> MaX
>
--
ciao,
MaX
Reply to: