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

Regex 在bash脚本中编辑字符串变量,regex,bash,awk,Regex,Bash,Awk,我有一个bash脚本,它查询postgresql数据库(仅供参考,它是一个SOGo群件数据库),并将一个文本字符串放入变量中。变量的值(我们称之为teststr)如下所示: c_defaults ---------------------------------------------------------------------------------------------------------------------------------- ---------------------

我有一个bash脚本,它查询postgresql数据库(仅供参考,它是一个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)
现在,我想做的是从开始一直删除所有数据,直到开始大括号(即删除c_默认值以及大括号开始前的所有破折号和一个空格),并删除结束大括号后的数据(即空格和“(1行)”字符串)

最后,teststr字符串应该只在大括号内有值。是否有任何类型的regex/awking可以用来编辑此字符串

编辑

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

使用
sed
进行就地编辑。(
-i
选项)。这可以从bash调用

sed -i -e 's/c_defaults\s[-\s]+//g' filename
使用
Perl
进行就地编辑。(
-i
选项)。由bash调用

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

使用
sed
进行就地编辑。(
-i
选项)。这可以从bash调用

sed -i -e 's/c_defaults\s[-\s]+//g' filename
使用
Perl
进行就地编辑。(
-i
选项)。由bash调用

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

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

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

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

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

您可以将容器与sed匹配:

sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }' file
如果从命令中获取数据,则可以通过管道传输:

your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }'
并将其保存到变量:

VAR=$(your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }')

您可以将容器与sed匹配:

sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }' file
如果从命令中获取数据,则可以通过管道传输:

your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }'
并将其保存到变量:

VAR=$(your_command a b | sed -ne '/{.*}/{ s|^[^{]*\({.*}\)[^}]*$|\1|; p; }')

你能再解释一下吗?我不熟悉perl。你能再解释一下吗?我不熟悉perl。小心,
sed
是贪婪的,所以您的
s |.*\({.*}\).*\1 |将比您希望的少。@cnicutar我考虑过
s|^[^{]*\({.*}\)[^}]*$|\1
但我发现小的已经足够了,我已经测试过了。也许我们当时使用的是不同版本的sed,因为我也测试过它,它捕获了文本的较小部分(即内部{…})。我正在使用GNU-sed版本4.2.1,你呢?@cnicutar 4.2.1也在这里。看来你说得对。我只看了结尾。很抱歉。小心,
sed
是贪婪的,所以你的
s |.*\({.*}\).*\1 |将比您希望的少。@cnicutar我考虑过
s|^[^{]*\({.*}\)[^}]*$|\1
但我发现小的已经足够了,我已经测试过了。也许我们当时使用的是不同版本的sed,因为我也测试过它,它捕获了文本的较小部分(即内部{…})。我正在使用GNU-sed版本4.2.1,你呢?@cnicutar 4.2.1也在这里。看来你说得对。我只看了结尾。很抱歉,这起作用了。我正在快速阅读sed和正则表达式,以清楚地了解这里发生的事情(我只熟悉sed的基本知识,从未将其与正则表达式结合)。谢谢你抽出时间,这很有效。我正在快速阅读sed和正则表达式,以清楚地了解这里发生的事情(我只熟悉sed的基本知识,从未将其与正则表达式结合)。谢谢你抽出时间。