2014-08-28 40 views
0

我有一个字符串为:提取文本

MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8 

我需要从第一次出现的提取部分{ "Instance":[{"InstanceID":"i-098098"}] }即“{”来的最后一次出现“}”,并保存在一个单独的文件。

+0

的[在bash提取子(http://stackoverflow.com/questions/428109/extract-substring-in-bash) – 2014-08-28 06:51:27

回答

0

如果你有这样的一个文件,

sed 's/^[^{]*//;s/[^}]*$//' file 

(这将打印到标准输出。重定向到一个文件或捕捉到一个变量或做什么,那就是你想用它做的事。)

如果你有这样的一个名为MESSAGES变量,

EXTRACTED=${MESSAGES#*{} 
EXTRACTED="{${EXTRACTED%\}*}}" 
+0

由于可能重复, Triplee它像魅力一样工作。你可以expalin模式? – user3744067 2014-08-28 09:01:29

+0

'sed'模式由两个替换组成:在第一个大括号之前替换所有内容,并在最后一个之后替换所有内容。 shell [参数扩展](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html)是类似的:通过第一个大括号删除所有内容,最后一个(然后重新提供已移除的大括号)。 – tripleee 2014-08-28 09:50:11

+0

@ user3744067's/^ [^ {] * //'将所有内容替换为第一个没有任何内容的“{”。 's/[^}] * $ //'最后一个'}后面的内容全部替换为空。 '[^}] *'表示每个不是'}的字符。 – 2014-08-28 09:51:39

0

我要么sedawk从建议。但是,最初的测试显示其更复杂一点,你可能会需要使用组合或管道:

echo "MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8" | sed 's/^\(.*\)}.*$/\1}/' | sed 's/^[^{]*{/{/' 

所以第一sed最后}后删除一切,并用}所以它仍然显示更换;第二个sed将所有内容删除至第一个{,并将其替换为{,以便它仍显示。

这是我得到的输出:

{ Instance:[{InstanceID:i-098098}] } 
+1

下面的tripleee的答案可能是更优雅 – SysadminB 2014-08-28 07:08:39

+0

嗨,你可以请分享你采取的详细方法,因为你得到的输出是我所需的输出。 TIA – user3744067 2014-08-28 08:18:27