在bash脚本中编辑字符串变量

时间:2021-05-09 01:46:52

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:

我有一个bash脚本查询postgresql数据库(fyi,它是一个SOGo群件数据库)并获取一个文本字符串到一个变量。变量的值(让我们称之为teststr)如下所示:

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": ["testuser@testdomain.com"], "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": ["testuser1@testdomain.com", "testuser2@testdomain.com"], "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).

现在,我想要做的是从开头一直删除所有数据,直到开始花括号(即删除c_defaults和所有破折号和大括号开头之前的一个空格)并删除最后的数据在结束大括号之后(即空白和'(1行)'字符串)。

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?

最后,teststr字符串应该只有花括号内的值。是否有任何类型的正则表达式/ awking可以编辑此字符串?

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.

我尝试了以下步骤:将名为teststr的变量写入文件。将文件从3美元到187美元(对于这个例子)写入另一个文件并将其读入变量。但是大小并不总是保持不变,花大括号内的值肯定会随着用户保存更多选项而增加。

3 个解决方案

#1


2  

You can use sed to remove anything up to the first { and everything after }:

您可以使用sed删除第一个{以及之后的所有内容}:

sed -e 's/^[^{]*//g' -e 's/}[^}]*$/}/' file

#2


1  

Use sed to do an in-place edit. (-i option). This can be called from bash.

使用sed进行就地编辑。 (-i选项)。这可以从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进行就地编辑。 (-i选项)。由bash调用。

> perl -pi -e 's/c_defaults\s[-\s]+//g' filename

#3


0  

You could just match the container with sed:

您可以将容器与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; }')

#1


2  

You can use sed to remove anything up to the first { and everything after }:

您可以使用sed删除第一个{以及之后的所有内容}:

sed -e 's/^[^{]*//g' -e 's/}[^}]*$/}/' file

#2


1  

Use sed to do an in-place edit. (-i option). This can be called from bash.

使用sed进行就地编辑。 (-i选项)。这可以从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进行就地编辑。 (-i选项)。由bash调用。

> perl -pi -e 's/c_defaults\s[-\s]+//g' filename

#3


0  

You could just match the container with sed:

您可以将容器与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; }')