提取文本
我有一个字符串为:提取文本
MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8
我需要从第一次出现的提取部分{ "Instance":[{"InstanceID":"i-098098"}] }
即“{”来的最后一次出现“}”,并保存在一个单独的文件。
如果你有这样的一个文件,
sed 's/^[^{]*//;s/[^}]*$//' file
(这将打印到标准输出。重定向到一个文件或捕捉到一个变量或做什么,那就是你想用它做的事。)
如果你有这样的一个名为MESSAGES
变量,
EXTRACTED=${MESSAGES#*{}
EXTRACTED="{${EXTRACTED%\}*}}"
由于可能重复, Triplee它像魅力一样工作。你可以expalin模式? – user3744067 2014-08-28 09:01:29
'sed'模式由两个替换组成:在第一个大括号之前替换所有内容,并在最后一个之后替换所有内容。 shell [参数扩展](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html)是类似的:通过第一个大括号删除所有内容,最后一个(然后重新提供已移除的大括号)。 – tripleee 2014-08-28 09:50:11
@ user3744067's/^ [^ {] * //'将所有内容替换为第一个没有任何内容的“{”。 's/[^}] * $ //'最后一个'}后面的内容全部替换为空。 '[^}] *'表示每个不是'}的字符。 – 2014-08-28 09:51:39
我要么sed
或awk
从建议。但是,最初的测试显示其更复杂一点,你可能会需要使用组合或管道:
echo "MESSAGES { "Instance":[{"InstanceID":"i-098098"}] } ff23710b29c0220849d4d4eded562770 45c391f7-ea54-47ee-9970-34957336e0b8" | sed 's/^\(.*\)}.*$/\1}/' | sed 's/^[^{]*{/{/'
所以第一sed
最后}
后删除一切,并用}
所以它仍然显示更换;第二个sed
将所有内容删除至第一个{
,并将其替换为{
,以便它仍显示。
这是我得到的输出:
{ Instance:[{InstanceID:i-098098}] }
下面的tripleee的答案可能是更优雅 – SysadminB 2014-08-28 07:08:39
嗨,你可以请分享你采取的详细方法,因为你得到的输出是我所需的输出。 TIA – user3744067 2014-08-28 08:18:27
的[在bash提取子(http://stackoverflow.com/questions/428109/extract-substring-in-bash) – 2014-08-28 06:51:27