Reputation: 3420
I have a bash script which queries a postgresql database (fyi, it is a SOGo groupware database) and gets a string of text into a variable. The value of the variable (let's call it teststr) looks like this:
c_defaults ----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
{"SOGoTimeFormat": "%H:%M", "SOGoMailShowSubscribedFoldersOnly": "0", "SOGoMailSignaturePlacement": "below", "SOGoLanguage": "English", "SOGoDayEndTime": "18:00", "SOGoDefaultCalendar": "selected", "SOGoFirstWeekOfYear": "January1", "SOGoFirstDayOfWeek": "0", "SOGoTimeZone": "Asia\/Kolkata", "SOGoContactsCategories": ["Business Partner", "Colleague", "Competitor", "Customer", "Family", "Friend", "Press", "Provider", "VIP"], "Vacation": {"enabled": 0, "endDate": 1374690600, "autoReplyEmailAddresses": ["[email protected]"], "ignoreLists": 1, "autoReplyText": "", "daysBetweenResponse": "7", "endDateEnabled": 0}, "SOGoCalendarTasksDefaultClassification": "PUBLIC", "SOGoMailSortByThreads": "0", "SOGoMailMessageCheck": "manually", "SOGoMailMessageForwarding": "inline", "SOGoLoginModule": "Mail", "SOGoCalendarCategoriesColors": {"Customer": "#aaa", "Calls": "#aaa", "Favorites": "#aaa", "Meeting": "#aaa", "Ideas": "#aaa", "Miscellaneous": "#aaa", "Birthday": "#aaa", "Anniversary": "#aaa", "Vacation": "#aaa", "Travel": "#aaa", "Projects": "#aaa", "Suppliers": "#aaa", "Gifts": "#aaa", "Clients": "#aaa", "Issues": "#aaa", "Business": "#aaa", "Holidays": "#aaa", "Personal": "#aaa", "Status": "#aaa", "Public Holiday": "#aaa", "Follow up": "#aaa", "Competition": "#aaa"}, "SOGoBusyOffHours": "0", "SOGoCalendarCategories": ["Customer", "Calls", "Favorites", "Meeting", "Ideas", "Miscellaneous", "Birthday", "Anniversary", "Vacation", "Travel", "Projects", "Suppliers", "Gifts", "Clients", "Issues", "Business", "Holidays", "Personal", "Status", "Competition", "Follow up", "Public Holiday"], "SOGoCalendarEventsDefaultClassification": "PUBLIC", "Forward": {"enabled": 1, "forwardAddress": ["[email protected]", "[email protected]"], "keepCopy": 1}, "SOGoRememberLastModule": "0", "SOGoMailReplyPlacement": "below", "SOGoMailDisplayRemoteInlineImages": "never", "SOGoSieveFilters": [{"actions": [{"method": "fileinto", "argument": "INBOX\/spam"}], "active": 1, "rules": [{"operator": "contains", "field": "subject", "value": "[SPAM]"}], "match": "any", "name": "spam"}, {"actions": [{"method": "fileinto", "argument": "INBOX\/spam"}], "active": 1, "rules": [{"operator": "contains", "field": "subject", "value": "TESTTEST"}], "match": "any", "name": "new"}], "SOGoDayStartTime": "08:00", "SOGoMailComposeMessageType": "text"} (1 row)
Now, what I want to do is remove all the data from the beginning all the way until the opening curly brace(i.e remove c_defaults and all the dashes and one space just before the beginning of the curly brace) and remove the data at the end after the closing curly brace (i.e. the whitespace and the '(1 row)' string).
At the end, the teststr string should only have the values inside the curly braces. Is there any sort of regex/awking that can be done to edit this string?
Edit
I tried the following steps: Wrote the variable called teststr into a file. catted and awked the file from $3 to $187 (for this example) into another file and read that into a variable. But the size isn't always going to remain the same as values inside the curly braces will surely increase as the user saves more options.
Upvotes: 0
Views: 147
Reputation: 75488
You could just match the container with sed:
sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }' file
If you get data from a command you could just pipe it:
your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }'
And save it to a variable:
VAR=$(your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }')
Upvotes: 0
Reputation: 70732
Use sed
to do an in-place edit. (-i
option). This can be called from bash.
sed -i -e 's/c_defaults\s[-\s]+//g' filename
Use Perl
to do an in-place edit. (-i
option). Invoked by bash.
> perl -pi -e 's/c_defaults\s[-\s]+//g' filename
Upvotes: 1
Reputation: 182649
You can use sed
to remove anything up to the first {
and everything after }
:
sed -e 's/^[^{]*//g' -e 's/}[^}]*$/}/' file
Upvotes: 2