I am writing a script to replace a base URL in a database dump with another base URL (to transfer the DB contents of Wordpress to another host). Replacing the URL is the easy part (currently doing it with sed).
However, there is a problem with the values of Wordpress' options table, which stores strings in PHP serialized format, producing something like ...;s:6:\"abcdef\";s:3:\"zzz\";... (variable type string, length 6 and 3, value "abcdef" and "zzz"). So whenever the length of the old and the new base URL differ, that option value won't be loaded, as the string length given does not match the length of the actual string anymore.
So that is the part where awk comes in: I am trying to match every string of the format s:number:\"baseurl/some_path\" and replace the number with the actual length of the baseurl/some_path string, to update the string length values.
The awk command I got so far is:
awk '{print gensub(/s:([0-9]+):\\"([^\\"]*)\\"/, sprintf("s:%d:\\\\\"%s\\\\\"", length("\\2"), "\\2"), "g") }' db_content_file
But this generates string lengths of 2, no matter what the actual string is, so I guess that \2 gets passed to the length function literally, without replacing it with the string stored in \2. Is it somehow possible to enforce such a replacement? Or should I use another tool?
Unfortunately, semicolons can occur in valid URLs so simply using split() will not work.
So it looks like you'll either have to use PHP to unserialize and re-serialize, or parse the serialized string. Based on your description, the following should do the job:
awk '
# Recompute the string lengths in a serialization in which strings
# are represented by segments such as: s:6:\"abcdef\";
# WARNING: the array a is global
function repopulate(s, a1,n) {
# match(string, regexp [, array])
# a[1] is set to the substring matching the first parenthesized subexpresssion, etc
n = match(s, /s:[0-9]+:\\"([^\\"]*)\\";(.*)/, a);
if (n<=0) {return s;}
a1=a[1];
return substr(s,1,n-1) "s:" length(a1) ":\\\"" a1 "\\\";" repopulate(a[2])
}
{ print repopulate($0) }'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With