rahuL
rahuL

Reputation: 3420

Editting a string variable in a bash script

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

Answers (3)

konsolebox
konsolebox

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

hwnd
hwnd

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

cnicutar
cnicutar

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

Related Questions